Ahogrammer

Deep Dive Into NLP, ML and Cloud

辞書を用いてテキストから病名を抽出する

医療分野の自然言語処理で基本となるタスクの一つにテキストからの病名の抽出があります。テキストから病名を抽出できると、たとえば、SNSのテキストから病気の流行を予測したり、広告技術と組み合わせて受診や薬の購入を促したり、対話システムと組み合わせて検診に使うといった応用に役立ちます。本記事では、辞書を使って病名を抽出する方法について紹介します。

準備

本記事では形態素解析の辞書を拡張してテキストから病名を抽出します。準備として病名の辞書をダウンロードします。病名の辞書としてはNAISTの研究室が公開している万病辞書を使います。万病辞書は医療従事者が記載した電子カルテや退院サマリから症状や病名に関連する語を広く抽出して作成されています。以下のページから最新のMeCab用辞書データをダウンロードしましょう。

sociocom.jp

方法

ダウンロードした辞書を使うには、MeCabのユーザ定義辞書のオプションに辞書のパスを渡します。以下ではユーザ定義辞書を渡した後「アレキサンダー病は1949年にAlexander WSにより報告された疾患です。」という文を解析しています。解析結果から「アレキサンダー病」に付帯情報が付いていて病名であることがわかります。

> mecab -u MANBYO_201907_Dic-utf8.dic
アレキサンダー病は1949年にAlexander WSにより報告された疾患です。
アレキサンダー病    名詞,サ変名詞,*,*,*,*,あれきさんだーびょう;icd=E752;lv=S/freq=低頻度;アレキサンダー病,あれきさんだーびょう,あれきさんだーびょう,3
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
1949    名詞,数,*,*,*,*,*
年 名詞,接尾,助数詞,*,*,*,年,ネン,ネン
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
Alexander   名詞,一般,*,*,*,*,*
WS  名詞,固有名詞,組織,*,*,*,*
により   助詞,格助詞,連語,*,*,*,により,ニヨリ,ニヨリ
報告  名詞,サ変接続,*,*,*,*,報告,ホウコク,ホーコク
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
疾患  名詞,一般,*,*,*,*,疾患,シッカン,シッカン
です  助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。 記号,句点,*,*,*,*,。,。,。
EOS

解説

万病辞書の中身は以下のようになっています。

f:id:Hironsan:20191007165556p:plain
万病辞書の中身

出現形というのは、電子カルテや退院サマリに実際に現れた症状や病名を表しています。それに対して、標準病名は出現形に対応する標準的な病名となっています。ICD(国際疾病分類)は統計分類であり、疾病をアルファベットと数字を組み合わせたコードで表しています。言語が異なっても同じ疾病は同一のコードで表されるため国際比較をするのに使うことができます。信頼度レベルというのは辞書を作成する際のアノテーションの一致度を表しています。

参考文献

検索エンジンにBERTを組み合わせて検索性能を向上させる手法

SIGIR 2019より以下の論文を紹介。NLP2019でも発表されており、わかりやすいスライド付き。

この論文では、行政サイトにあるFAQの検索を検索エンジンとBERTを組み合わせて検索性能を向上させる手法を提案している。今までの課題として、通常の検索エンジンを使った場合、クエリとQAの間に表現のズレがあると上手く検索できない点を挙げている。たとえば、以下の画像の場合、ユーザのクエリに対して単純な記号マッチで検索すると「チューリップ運動」がヒットしてしまう。そこでこの論文では、通常の検索エンジンとBERTを組み合わせることでより柔軟な検索を実現している。実験の結果、提案手法が効果的であることを示した。

f:id:Hironsan:20191004072928p:plain
クエリとQAのマッチング(画像はスライドより引用)

手法としては、TSUBAKIとBERTを統合したモデルを提案している。TSUBAKIは同義表現や係り受けを考慮できる検索エンジン基盤であり、わかりやすく言えばElasticsearchのようなものだと考えればいい。手法をより具体的に説明すると、TSUBAKIで計算したクエリと質問間の類似度(q-Q類似度)とBERTで計算したクエリと回答間の類似度(q-A類似度)を統合してランク付けをしている。BERTに関して言えば、実際に集めたQAのペアを使って2値分類のモデルを学習させることで、質問と回答の関連を捉えている。

f:id:Hironsan:20191004074354p:plain
提案手法(画像はスライドより引用)

TSUBAKIとBERTの統合では単純統合とTSUBAKI優先統合の2種類を提案している。単純統合ではTSUBAKIとBERTのスコアを加算しランキングする方法となっている。一方、TSUBAKI優先統合はTSUBAKIのスコアがしきい値以上の場合には優先的にランキングする手法となっている。これは、TSUBAKIのスコアが高い場合は、クエリと質問間で重複した単語が多く使われていることから、正解である可能性が高いという仮説に基づいている。

実験結果は以下の通り。実験では尼崎市のFAQを対象に実験を行っている。SIGIRではそれに加えてStackExchangeも対象としている。結果を見るとTSUBAKIとBERTを組み合わせた手法はTSUBAKIやBERT単体の手法と比べて性能が大きく向上していることを確認できる。

f:id:Hironsan:20191004080908p:plain
実験結果

感想

以前にElasticsearchとBERTを組み合わせて類似文書検索という記事を書いた。この記事では簡単に試すことに主眼を置いていたので、性能面は気にしていなかったのだが、試した方はわかるように性能は良くない。そういうわけで、なにか良い手法がないかと思ってSIGIRを調べた結果、この論文に出会った。社内の問い合わせシステムの高度化なんかにも使えそう。

検索分野には詳しくないのでなんとも言えないが、前の記事でやったような固定長のベクトルだけを使って検索性能を出すというのはなかなか厳しいのではないかと思う。それよりは、今回の論文のような記号マッチングと組み合わせる手法の方が可能性があるように感じた。

BERTでテキストを固定長に変換するような手法が、対象テキストの長さによって性能がどのように変化するのは知りたいところ。GLUEを見るとBERT系のモデルが文類似度タスクが得意なのは確かであるが、その対象テキストは比較的短いものが多い。STS-Bでざっくりと見た場合、15語程度のテキストが多いという結果になっている。そうであるなら、文書全体を一つのベクトルにするのではなく、文に分割した後、各文をベクトルに変換してElasticsearchなりなんなりに放り込むというやり方も考えられる。このあたりは引き続きサーベイを行う。

生体医療分野における自然言語処理の10種競技

ACL 2019より以下の論文を紹介。

この論文では、生体医療分野の自然言語処理におけるベンチマークの提案とベンチマークに対する転移学習性能の評価を行っている。最近の自然言語処理ではモデルの総合的な性能を評価するためにGLUEというベンチマークが使われる。GLUEには文類似度や推論といったタスクのデータセットが含まれ、これらを使ってモデルの総合的な性能のスコアを算出する。この論文で提案しているのはその生体医療版とでも言うべきベンチマーク(BLUE)で、5つのタスクと10のデータセットが含まれる。BERTを用いたモデルを使って性能を測定したところ最高性能となった。

作成したベンチマークであるBLUEには5つのタスクと10のデータセットが含まれる。以下の表に全体像を示す。タスクとしては、文類似度(Sentence similarity)、固有表現認識(NER)、関係抽出(Relation extraction)、文書分類(Document classification)、推論(Inference)の5つとなっている。

f:id:Hironsan:20191003060718p:plain
BLUEのタスク

文類似度タスクは、文のペアが与えられたときにその類似度を予測するタスクとなっている。学習用データセットの類似度は人間がラベル付けしており、データセットにもよるが0から5くらいの値が使われている。この数字が高いほど類似性が高いことを示す。この人間が付けた類似度とモデルが予測した類似度の相関によって性能が評価される。イメージを掴むために、以下に例を示した。

類似度 文1 文2
5.0 東京 東京
5.0 太郎と花子は友達だ 太郎と花子は友人だ
0.0 お化け屋敷怖い ラーメンが好き

固有表現認識は、テキスト中で固有表現が出現する位置を特定し、人名や地名などの固有表現タイプを付与するタスクのことを指している。一般的には人名や地名、組織名といったタイプがよく使われているが、生体医療分野の場合は化学物質名や病気名といったタイプが使われることになる。以下に固有表現認識の例を示した。

f:id:Hironsan:20191003082505p:plain
固有表現認識の例

関係抽出はテキスト中に出現する固有表現間にある関係を予測するタスクとなっている。たとえば、「バラク・オバマとミシェル・オバマはXX年に結婚した」というテキストがあったとする。その場合、固有表現として「バラク・オバマ」と「ミシェル・オバマ」、その間の関係としては「夫婦」を予測するといった具合になる。以下に関係抽出の例を示した。

f:id:Hironsan:20191003085942p:plain
関係抽出の例

文書分類についてはご存知だと思うので割愛して、推論について説明する。推論というのは、与えられた前提(Premise)の元で仮説(Hypothesis)が正しい(entailment)か否(contradiction)かを判断するタスクとなっている。イメージを掴むために以下に例を示した。正しいか否か以外にどちらとも言えない(neutral)が含まれることもある。

ラベル 前提 仮説
contradiction ある東アジアの国で、ある男が制服を検査している。 ある男は眠っている。
neutral 年配の男と若い男が笑っている。 二人の男が笑みを浮かべて、床で遊ぶ猫を笑っている。
entailment 男たちがサッカーで遊んでいる。 男たちがスポーツをしている。

実験ではBERTとELMoを使ったモデルを使って、10種類のデータセットに対する性能を測定している。BERTの事前学習は、医学・生物学文献データベースであるPubMedから論文のアブストラクトを抽出したテキストと健康関連のデータベースであるMIMIC-Ⅲを使って行っている。ELMoの方はPubMedを使っている。実験結果は以下の表の通り。

f:id:Hironsan:20191003060745p:plain
実験結果

結果を見ると、すべてのタスクにおいてBERTを事前学習したモデルが最高性能(SOTA)を出していることがわかる。特にBERTのBASEモデルをPubMedとMIMIC-Ⅲのテキストを使って事前学習させたモデルが好成績を収めている。

感想

医療分野の自然言語処理ってどういうタスクが行われていて、現状どのくらいの性能が出ているのが気になっているときに見つけた論文。ちょうどこの論文ではよく使われるデータセットに対してSOTAを出していたので、ジャストミートな論文であった。多くのタスクで実用できそうな性能を出していることがわかったので、今後はこれらを使ってどのような問題を解決できるかに絞って調査すればよさそうである。