top of page

LangChain Taggingで課題解決手段マップ作成

更新日:2023年7月21日

1.初めに

  • 特許文章を課題と解決手段の2軸で整理して可視化するのは、昔から行われています。

  • 問題なのが、最終的に人手で課題と解決手段を文書から読み取ってタグ付け・分類付与する必要がある点です(特許分類などを使うのを除けば)。

  • これを省力化・自動化しようとした試みと経過は以下のとおりです。

手法

概要

結果

LDAのトピックを自分で指定する

あまり良くない。

手がかり表現をもとにクロスブートストラップと呼ぶ手法で課題・効果表現対を芋づる式に抽出

アルゴリズムをコード化する前に力尽きる。本家のものはウェブアプリもあり。

固有表現抽出(Googleなど

固有表現抽出で課題や解決手段を抽出

  • そんな中LangChainのライブラリを漁っていると、Taggingというページを発見。

  • twitterでも”Another killer use case is extracting structured information from unstructured docs”とのことで、テキストから、自分の指定した属性(タグ)の情報を抽出してくれる、とのこと。

  • 読んでいるうちに、これは課題解決手段の抽出に使えるのでは!?と思い試してみることに。



2.作成手順

  • Taggingの基本的な使い方は、公式ページのとおりschemaを自分の好きなようにいじればいいそうで。

 schema = {
    "properties": {
        "sentiment": {"type": "string"},
        "aggressiveness": {"type": "integer"},
        "language": {"type": "string"},
    }
}

  • もうちょっと縛りを入れたい場合、タグの指定="enum"と、タグの説明="description"で自分の指定したいタグを教えます。

  • これでLLMが理解してくれるということで、人にお願いする感覚です。

schema ={
    "properties":{
        "sentiment":{"type":"string","enum":["happy","neutral","sad"]},
        "aggressiveness":{
            "type":"integer",
            "enum":[1,2,3,4,5],
            "description":"describes how aggressive the statement is, the higher the number the more aggressive",
        },
        "language":{
            "type":"string",
            "enum":["spanish","english","french","german","italian"],
         },
    },
    "required":["language","sentiment","aggressiveness"],
}


3.実行例

  • 早速10文章くらいの特許文書を取ってきて、Taggingをお願いすることに。

import pandas as pd
df = pd.read_csv("*****.csv",encoding="cp932")
df.head(10)


  • とりあえず単純なスキーマで。

  • schmaその1

schema = {
    "properties": {
        "課題": {"type": "string","description":"発明が解決しようとする課題を抽出"},
        "解決手段": {"type": "string","description":"課題を解決するための方法や手段を抽出"},
        "効果": {"type": "string","description":"発明によるメリットや効果"},
    },
"required": ["課題", "解決手段"],
}

chain = create_tagging_chain(schema=schema, llm=llm)

df["要約"].iloc[0:10].apply(chain.run)



  • 結構いい感じに抽出してくれてますね。それぞれの軸をもう少し縛るために、schemaを指定。

  • schmaその2

schema = {
    "properties": {
        "課題": {"type": "string","description":"発明が解決しようとする課題を抽出"
        ,"enum":["生産性","滋養強壮","ダイエット","安全性","抗酸化","血中脂質改善、血圧降下","美容"]},
        "解決手段": {"type": "string","description":"課題を解決するための方法や手段を抽出"
        ,"enum":["製造-酵素処理","製造-造粒・成形","製造-粉砕","製造-発酵","製造-混合・攪拌","製造-洗浄","製造-化学的処理","製造-加熱","製造-分離抽出","製造-冷却","製造-乾燥","製造-その他"]},
        "効果": {"type": "string","description":"発明によるメリットや効果"
               },
    },
"required": ["課題", "解決手段"],
}



  • 結構いい感じにタグを付与してくれています!

  • 一部enumに従ってなかったりしてたり・・。指定した軸にどうもあてはまらないものが出るようですね。これもこれで軸の選定情報として使えそうです。



4.その他

  • 現状、TagiingがOPENAIのAPIしか利用できず、GPT-3.5のみでの実験でした。Azureに対応してくれれば、GPT-4が使えるので、対応後にまた実験してみようと思います。

  • 同じような機能に、vertexAIでもTaggingに対応するような機能があったので、使ってみたいです。


  • Extraction でも同様にできそうです。taggingと同じく、create_extraction_chain(schema,llm)でschemaとllmを指定すればできました。

from langchain.chains import create_extraction_chain, create_extraction_chain_pydantic

chain = create_extraction_chain(schema, llm)



その他:schemaについては、複数付与のパターンもあることを考慮して、下記のような書き方も大丈夫でした。"type": "array", "items": {...}のような書き方です。


schema = {
    "properties": {
        "課題s": {
        "type": "array",
        "items": {
                "name": "課題",
                "description": "発明が解決しようとする課題を抽出",
                "type": "string",
                "enum":["生産性","滋養強壮","ダイエット","安全性","抗酸化","血中脂質改善、血圧降下","美容"]
                },
              #"required": True,
            },
                    
        "解決手段s": {
            "type": "array",
            "items": {
                "name" : "解決手段",
                "description":"課題を解決するための方法や手段",
                "enum":["製造-酵素処理","製造-造粒・成形","製造-粉砕","製造-発酵","製造-混合・攪拌","製造-洗浄","製造-化学的処理","製造-加熱","製造-分離抽出","製造-冷却","製造-乾燥","製造-その他"]}
            },
        "効果": {"type": "string","description":"発明によるメリットや効果"
               },
    },
#"required": ["課題s", "解決手段s"],
}



閲覧数:978回0件のコメント

最新記事

すべて表示

Comments


bottom of page