最近GiNZAを使って固有表現抽出するという記事をよく見かける気がします。具体的には、この辺りの記事を見てました。
ということで、なんだか面白そうで、自分でもやってみたのでそのメモです。
固有表現抽出 is なに?
wikipediaによれば、こんな感じで書いてあります。
固有表現抽出(こゆうひょうげんちゅうしゅつ、英: named entity recognition、named entity identification、named entity chunking、named entity extraction)とは、計算機を用いた自然言語処理技術の一つであり、情報抽出の一分野である。文中から固有表現 (Named Entity) を抽出し、それを固有名詞(人名、組織名、地名など)や日付、時間表現、数量、金額、パーセンテージなどのあらかじめ定義された固有表現分類へと分類する。 固有表現抽出 - Wikipedia
個人情報を見つけて削除する用途や、検索・推薦の際にはかなり価値の高い情報なので個別に取り扱ったりする用途がありそうですね。
GiNZA is なに?
「GiNZA」は、ワンステップでの導入、高速・高精度な解析処理、単語依存構造解析レベルの国際化対応などの特長を備えた日本語自然言語処理オープンソースライブラリです。「GiNZA」は、最先端の機械学習技術を取り入れた自然言語処理ライブラリ「spaCy」(※5)をフレームワークとして利用しており、また、オープンソース形態素解析器「SudachiPy」(※6)を内部に組み込み、トークン化処理に利用しています。「GiNZA日本語UDモデル」にはMegagon Labsと国立国語研究所の共同研究成果が組み込まれています。 リクルートのAI研究機関、国立国語研究所との共同研究成果を用いた日本語の自然言語処理ライブラリ「GiNZA」を公開 | Recruit - リクルートグループ
GiNZA自体は固有表現抽出だけでなく、その他様々な用途で使用できるようですね。
やってみる
ここまで調べた感じ、固有表現抽出の目標は下記を判別して行くことが目標になります。
- 固有名詞(人名、組織名、地名など)や日付、時間表現、数量、金額、パーセンテージなどのあらかじめ定義された固有表現
実際に自分でやってみたいと思います。
データセット
livedoor ニュースコーパスを使ってみます。 こんな感じのshellscriptを走らせると取れます。
#!/bin/sh wget https://www.rondhuit.com/download/ldcc-20140209.tar.gz tar zxvf ldcc-20140209.tar.gz rm ldcc-20140209.tar.gz
環境
kaggleのPython環境を使用しました。dockerコマンドはこちら。
docker run -v $PWD:/tmp/working -w=/tmp/working -p 8080:8080 --rm -it gcr.io/kaggle-images/python jupyter notebook --no-browser --ip="0.0.0.0" --notebook-dir=/tmp/working --allow-root
固有表現抽出
GiNZA使用して、実際ににマスキングしてみた結果はこんな感じになりました。
最後のセルでマスキングした結果を表示しています。 ここでは人名などを<PERSON>などで置き換えています。 このようにすれば、個人情報をマスキングしていくことができそうです。
途中の可視化の段階では、表示が消えてしまっていますが、jupyter-notebook上では固有表現をきれいに表示されます。
すぐ使えるという点では非常に有用だと感じました。 精度の点では、一見するとうまく取れているようにも見えますが、ちゃんと結果を読んでみるとまだまだ改善の余地があるようにも見えました。 この点の精度が要求される場合には、自分で固有表現抽出の学習をやっていく必要がありそうです。
追記(2022-06-12)
こちらのコードが動かないという報告をいただきましたので、修正して動作確認したコードを公開することにしました。 spacyのアップデートによって、一部使い方が変更になったため動作していないようだったので、改めて書いたスクリプトはこんな感じになります。
多分動くであろうファイル一式はこちら。
参考にさせていただいたサイト
感想
今回はGiNZAを使って固有表現抽出をやってみました。 使うのは非常にかんたんなので、必要になったら使ってみようと思います。