🔤

wikipedia dump から固有表現抽出(NER)のためのデータセットを作るメモ

2024/02/07に公開

背景

LLM 向け日本語データセット(コーパス)構築している...
扱うのは TB 単位の日本語...

jagger-python https://zenn.dev/syoyo/articles/9ac920632ba5c9
jdepp-python https://zenn.dev/syoyo/articles/d642867aae9aee

で高速な形態素解析と係り受け解析はできた!
次, 照応解析, 共参照解析(coref)したいがそのまえに固有表現抽出(ner)が必要っぽい.

Wikipediaを用いた日本語の固有表現抽出データセット
https://github.com/stockmarkteam/ner-wikipedia-dataset

があるが, 件数が少なそ?
あと人力アノテーションつらいぽよ...
全部自動でやりたいぽよ...

wikipedia dump から抽出します!

方針

wikipedia の title を固有表現, category のメタ情報をベースに分類を決めます.

category は wikipedia のページの下部にあります.
たとえば「富士山」の例

注意点

「時間表現」, 「数値表現」は難しいと思いますので今回はあきらめます.
(これらは, ある程度は正規表現で抽出できそ?)

wikipedia dump

wikipedia の dump は wiki40b ja がありますが,

https://zenn.dev/syoyo/articles/a83d44f4d2da1e

こちらには wikidata id, version id, (フィルタされた)テキスト本文しかありません.

Wikipediaの前処理はもうやめて「Wiki-40B」を使う
https://hironsan.hatenablog.com/entry/how-to-use-wiki40b

そのため, category 情報がなく, 固有名詞(wikipedia ページタイトル)が人名なのか, 地名なのかなどは不明です.

今回は mediawiki dump を使います. xml ファイルで, 展開して 13 GB くらいです.

【Python】10GB以上のXMLデータ中のテキストデータを淡々と抜き出す。
https://qiita.com/e-a-st/items/8a9a791f302f03414f38

ありがとうございます!

Category 情報は

[[Category:aaa]]
[[Category:bbb]]

みたいになっているので, テキストから [[Category: で始まる行を抜き出せば OK

コードはこんな感じになりました

https://github.com/lighttransport/japanese-llama-experiment/blob/main/ner/extract_title_and_category.py

分類

...
{"title": "入江喜和", "category": "[[Category:日本の漫画家]][[Category:東京都出身の人物]][[C
ategory:1966年生]][[Category:存命人物]]", "id": 101}
{"title": "いわしげ孝", "category": "[[Category:日本の漫画家]][[Category:鹿児島県立鹿児島工>業高等学校出身の人物]][[Category:二松學舍大学出身の人物]][[Category:鹿児島県出身の人物]][[Category:1954年生]][[Category:2013年没]]", "id": 103}
...

こんな感じの JSONL ができます.
20240201 dump では, title は 121 万件ほどになりました.

あとはこれをベースに分類を作って振り分ければよいでしょう!

一筋縄ではいかぬ...?

ただ, Category に「人物」とあれば人名に分類とかやりやすいですが,

{"title": "ゴーダチーズ", "category": "[[Category:オランダのチーズ]][[Category:牛乳のチーズ]]", "id": 5}

みたいに Category から直接分類を推定するのが難しいのもあります. 「ゴーダチーズ」なら「食べ物名」に分類したいところ.
とりあえずこの場合は, title や Category 文章を形態素解析なりで「チーズ」に分解できれば, 「チーズ」の title のページから Category が発酵乳製品なので食べ物と分類できます.

{"title": "Category:チーズ", "category": "[[Category:発酵乳製品]]", "id": 21095}

その他, 分類できなかったのは, KWJA https://nlp.ist.i.kyoto-u.ac.jp/?KWJA や GiNZA なりで NER 判定させてみるといいかもしれません.

あとは

{"title": "必ずお読み下さい。", "category": "[[Category:漫画作品 か|ならすおよみくたさい]][[Category:文芸雑誌掲載漫画作品]][[Category:2000年の漫画]]", "id": 188

みたいなややこしいタイトルの漫画とか...
これは係り受け解析などして, 前後のコンテキストを見て判定すればいけるか...???

さらなる高みへ...

wikidata からの情報取得

wiki40b には wikidata id というのがついています.

例えば「富士山」

https://www.wikidata.org/wiki/Q39231

「読み」や, 位置情報などあり, これらを使えばより高みへ到達できるでしょう.
(照応解析や共参照解析でより精度よく解析できそう)

ただ, wikidata は圧縮時で 100GB あります.

Wikidata dumpでかすぎる問題
https://qiita.com/CivFractal/items/e3a6b0274428cf96f3a5

展開すると 1TB 超えます. 日本語だけの dump は無いようです.

ただ, 中身は JSONL のようなので, 展開したら LLM 向けデータセット構築で作った TB 単位 JSONL 扱いツール(e.g. 自前 C++ JSONL parser )が役立つでしょう...

拡張固有表現

http://ene-project.info/

拡張固有表現定義の更新と日本語 Wikipedia 分類データ 2019
https://www.anlp.jp/proceedings/annual_meeting/2020/pdf_dir/P5-13.pdf

なんか拡張を定義しているようです.
こちらを参考にして, 固有表現の分類を拡充するとなにかいいことが起こるかもしれません.

Discussion