Text Analysis Conferenceまとめ

NLP系Shared taskで医薬品の名称や関係を抽出するデータセットが公開されていたのでチェックしてみました。

Text Analysis Conferenceとは

Text Analysis Conference (TAC)はNLP系のワークショップです。2008年から行われていて、特に応用に着目しているようです。

毎年いくつかのトラックが設定されており、2017年から医薬品関連の情報抽出が取り上げられるているようなので今回まとめてみました。

Extraction from Drug Labels

アメリカ食品医薬品局(FDA)は医薬品, 動物用医薬品などの安全性, 効能を管理しています。これまでFDAとアメリカ国立医学図書館(NLM)はStructured Product Labeling(SLP)というフォーマットで保持されている処方薬の情報をより機械可読なデータに変換しようと試みてきました。

2017年からFDAがTACに課題とデータセットを提供しているようです。

2017年は「Adverse Drug Reaction Extraction from Drug Labels」という課題が公開されました。これはSPLから薬の副作用を抽出するタスクです。

2018, 2019年は少し変わって「Drug-Drug Interaction Extraction from Drug Labels」。薬同士の相互作用を抽出するタスクです。

Adverse Drug Reaction Extraction from Drug Labels

2017年だけ実施して、2018年には行われませんでした。難しすぎたのかな?

後ほどまとめます。

https://bionlp.nlm.nih.gov/tac2017adversereactions/

Drug-Drug Interaction Extraction from Drug Labels

2017ではSPL報告書から薬の副作用を自動的に抽出するという課題に取り組まれました。ところで副作用と同じくらい重要で困難な課題が薬剤相互作用(drug-drug interaction)の自動抽出です。薬剤相互作用は様々な副作用を引き起こし米国の死因8位となっています。2018, 2019はこのdrug-drug interactionが抽出対象です。



データセット

  • training set:
    • Training22: 22 SPLs (半自動的に生成されたのち専門家が修正)
      • 603 sents (interactionの記述の有無はだいたい半々)
    • Additional Training: 180 SPLs (TAC 2018ではNLMのフォーマットだったがTAC 2019で本タスク用に調整)
      • 8,000 sents (interactionの記述の有無はだいたい半々)
  • test set:
    • Test1: 57 SPLs
    • Test2: 66 SPLs (Drug InteractionとClinical Phamacologyのみ評価対象)

ラベル

  • Entity
    • Precipitant: 薬と相互作用を起こすのもの(ex. drug, drug class, drug family, food substance)
    • Trigger: 相互作用を認識するtrigger word or phrase(ex. avoid, increase the risk)、TAC 2019で評価対象外に
    • SpecificInteraction: 相互作用の結果(ex. severe hyperkalemia)
  • Relation
    • Pharmacokinetic: 薬物動態学的作用、NLM-180ではIncrease, Decreaseタグに該当する関係(ex. 利尿作用の亢進)
    • Pharmacodynamic: 薬力学的作用、NLM-180ではSpecific Interactionに該当する関係(ex. 薬剤効果の亢進, リスクの亢進)
    • Unspecified: その他、NLM-180ではCaution Interactionに該当する関係(ex. “使用を避ける”など)

タスク

  • Task 1: entity-level annotations
  • Task 2: relatoins
  • Task 3: unique Interactions
  • Task 4: unique Interactions???

データ構造

評価スクリプト

データをのぞいてみる

アノテーション情報やデータのフォーマットについては以下に詳しくあります。

実際のデータのスキーマが以下のxsd, dtdファイルに定義されています。

ものは試しにxsdファイルを開いてみます。

超!読みづらい!そっ閉じ案件です。

良さげなビューワーが無いか探します。ウェブ上で使えるものがいくつかありましたが、ピンと来るものなし。

Chrome extensionのXML Treeがよさげでした。

選択している部分がハイライトされるのでわかりやすい。

XMLのスキーマの記法についてはリアルタイムで勉強します。

ざっと眺めて、

  • Label
    • Text
      • Section
    • Sentences
      • Sentence
        • SentenceText
        • Mention
        • Interaction
    • LabelInteractions
      • LabelInteraction

例えばtrainに含まれるAdenocardに関するファイルのTextには説明書的内容が示されています。

<Label drug="Adenocard" setid="f0e32589-dad9-4887-8481-bcf7f6618466">
  <Text>
    <Section name="CONTRAINDICATIONS SECTION" id="34070-3">
Contraindications 

 Intravenous Adenocard (adenosine injection) is contraindicated in: 

 Second- or third-degree A-V block (except in patients with a functioning artificial pacemaker). 
 Sinus node disease, such as sick sinus syndrome or symptomatic bradycardia (except in patients with a functioning artificial pacemaker). 
 Known hypersensitivity to adenosine.</Section>
...

これは実際の説明書と比べると概ね赤枠に書いてあるような内容と一致します。

akorn.com/documents/catalog/sell_sheets/17478-544-30.pdf

Sentenceはこのように記述されます。

<Sentence id="514" LabelDrug="Adenocard" section="34073-7">
  <SentenceText>Digoxin and verapamil use may be rarely associated with ventricular fibrillation when combined with Adenocard (see Warnings ).</SentenceText>
  <Mention id="M13" type="Trigger" span="40 15" str="associated with"/>
  <Mention id="M11" type="Precipitant" span="0 7" str="Digoxin" code="N0000005903"/>
  <Mention id="M15" type="SpecificInteraction" span="56 24" str="ventricular fibrillation" code="71908006: Ventricular fibrillation (disorder)"/>
  <Mention id="M14" type="Precipitant" span="12 9" str="verapamil" code="N0000007093"/>
  <Interaction id="I4" type="Pharmacodynamic interaction" trigger="M13" precipitant="M11" effect="M15"/>
  <Interaction id="I5" type="Pharmacodynamic interaction" trigger="M13" precipitant="M14" effect="M15"/>
</Sentence>

“digoxin, verapamilはAdenocardと結合すると心室細動とほとんど関連しない”って感じでしょうか(直訳感)

訳はともあれ、この文章にはdigoxin, verapamilというPrecipitantが登場し(entity)、それぞれAdenocardとPharmacodynamic interactionを持つ(relation)ことがXMLで記述されています。

末尾のLabelInteractionにはtype (relationの種類), precipitant (相互作用を持つ薬剤), precipitantCode (薬剤のコード), effect (relationの詳細な効果)が属性として記述されています。

precipitantCode, effectを見るとこの段階で正規化されていることがわかります。

<LabelInteractions>
  <LabelInteraction type="Pharmacodynamic interaction" precipitant="carbamazepine" precipitantCode="N0000007470" effect="233916004: Heart block (disorder)"/>
  <LabelInteraction type="Pharmacodynamic interaction" precipitant="digoxin" precipitantCode="N0000005903" effect="71908006: Ventricular fibrillation (disorder)"/>
  <LabelInteraction type="Pharmacodynamic interaction" precipitant="verapamil" precipitantCode="N0000007093" effect="71908006: Ventricular fibrillation (disorder)"/>
  <LabelInteraction type="Pharmacodynamic interaction" precipitant="digitalis" precipitantCode="N0000147198" effect="71908006: Ventricular fibrillation (disorder)"/>
  <LabelInteraction type="Pharmacodynamic interaction" precipitant="dipyridamole" precipitantCode="N0000006853" effect="NO MAP"/>
  <LabelInteraction type="Pharmacodynamic interaction" precipitant="methylxanthines" precipitantCode="N0000179192" effect="NO MAP"/>
  <LabelInteraction type="Pharmacodynamic interaction" precipitant="caffeine" precipitantCode="N0000006506" effect="NO MAP"/>
  <LabelInteraction type="Pharmacodynamic interaction" precipitant="theophylline" precipitantCode="N0000007076" effect="NO MAP"/>
</LabelInteractions>

復習すると一つのxmlファイルには大まかに以下の内容が含まれます。

  • Text: 薬剤の概要
  • Sentences: この薬剤について言及した文章。文章内に他の薬剤との相互作用について記述があればMention (entity), Interaction (relation)を併記
  • LabelInteractions: Sentencesを正規化した情報

これを機械的に出力しようというのが今回のタスクの目的です。

なぜか重複があったり。

<Sentence id="581" LabelDrug="ADCIRCA" section="34073-7">
  <SentenceText>Ritonavir initially inhibits and later induces CYP3A , the enzyme involved in the metabolism of tadalafil .</SentenceText>
  <Mention id="M101" type="Trigger" span="39 13" str="induces CYP3A"/>
  <Mention id="M104" type="Precipitant" span="0 9" str="Ritonavir" code="N0000007423"/>
  <Mention id="M103" type="Trigger" span="20 8;47 5" str="inhibits | CYP3A"/>
  <Interaction id="I43" type="Unspecified interaction" trigger="M101" precipitant="M104"/>
  <Interaction id="I44" type="Unspecified interaction" trigger="M103" precipitant="M104"/>
</Sentence>
  <Sentence id="581" LabelDrug="ADCIRCA" section="34073-7">
  <SentenceText>Ritonavir initially inhibits and later induces CYP3A , the enzyme involved in the metabolism of tadalafil .</SentenceText>
  <Mention id="M105" type="Trigger" span="39 13" str="induces CYP3A"/>
  <Mention id="M108" type="Precipitant" span="0 9" str="Ritonavir" code="N0000007423"/>
  <Mention id="M107" type="Trigger" span="20 8;47 5" str="inhibits | CYP3A"/>
  <Interaction id="I45" type="Unspecified interaction" trigger="M105" precipitant="M108"/>
  <Interaction id="I46" type="Unspecified interaction" trigger="M107" precipitant="M108"/>
</Sentence>

運営に尋ねたところ20分で返信来ました。

Thank you for bringing this to our attention!

It looks like this error was introduced in the additional training data this year, so it should not have affected the 2018 test results. We will make sure there are no duplicates in the 2019 test files.

とのことです。うーん、2018のtrainに入ってたんだけどな。testに入ってなくても学習に影響ありそう。

評価

公式から提供されるtacEval.pyを使います。gold_dir, guess_dirは適宜xmlファイルを置いてあるディレクトリを指定しましょう。

$ python tacEval.py gold_dir guess_dir

中身ではgold_dirとguess_dirのファイルを突合しています。

試しにtrainのディレクトリを指定してみます(当然同じファイルを指定しているので完全一致、スコアは100になります)。

$ python tacEval.py trainingFiles trainingFiles

Gold Directory:  trainingFiles
Guess Directory: trainingFiles
--------------------------------------------------
Task 1 Results:
  Exact (+type)
    TP: 1183  FP: 0  FN: 0
    Precision: 100.00
    Recall:    100.00
    F1:        100.00  (PRIMARY)
  Exact (-type)
    TP: 1182  FP: 0  FN: 0
    Precision: 100.00
    Recall:    100.00
    F1:        100.00  
--------------------------------------------------
Task 2 Results:
  Full (+type)
    TP: 668  FP: 0  FN: 0
    Precision: 100.00
    Recall:    100.00
    F1:        100.00  (PRIMARY)
  Full (-type)
    TP: 668  FP: 0  FN: 0
    Precision: 100.00
    Recall:    100.00
    F1:        100.00  
  Binary (+type)
    TP: 626  FP: 0  FN: 0
    Precision: 100.00
    Recall:    100.00
    F1:        100.00  
  Binary (-type)
    TP: 626  FP: 0  FN: 0
    Precision: 100.00
    Recall:    100.00
    F1:        100.00  
--------------------------------------------------
Task 3 Results:
    TP: 450  FP: 0  FN: 0
    Micro-Precision: 100.00
    Micro-Recall:    100.00
    Micro-F1:        100.00
    Macro-Precision  100.00
    Macro-Recall     100.00
    Macro-F1         100.00  (PRIMARY)
--------------------------------------------------
Task 4 Results:
    TP: 565  FP: 0  FN: 0
    Micro-Precision: 100.00
    Micro-Recall:    100.00
    Micro-F1:        100.00
    Macro-Precision  100.00
    Macro-Recall     100.00
    Macro-F1         100.00  (PRIMARY)

Task 1~4の結果が出力されました。

しかしTAC 2019で追加されたAdditional Trainingはspanが-1から始まるMentionが入っているため、評価スクリプトを実行するとエラーが出ます。運営によればTAC 2019用の評価スクリプトを近々配布するとのことです。

実際にチャレンジしてみる

TAC 2019追加のtrainは微妙に評価ができないので、TAC 2018の22 SPLs, 600 sentsを使います。

まずはNER部分だけでもやってみようと思います。しかし使いずらいデータ形状だ。。。

TODO: 実験してみたら更新

所感

元の目論見としては薬剤名のNERのデータセットを入手したかったのですが、DDIのアノテーションのルールではinteractionがない場合はMentionに薬剤名を記述しないようです。つまりTAC 2018 trainの600sentsのうち300 sentsくらいしか使えない。

TAC 2019も入れれば8,000 sentsの半分の4,000 sentsくらいは手に入るけど、どんなもんでしょ。CoNLLフォーマットに変換して自前のモデルに流し込んでCHEMDNERなどと比較してみよう。

参考

TAC

薬学関連

XML Schema

コメントを残す