ナード戦隊データマン

機械学習と自然言語処理についてのブログ

語の定義を自動的に抽出する

Wikipediaにおけるエンティティとは、「ジョン・フォン・ノイマン」のようなタイトルを持つ、各々のページのことです。今回は、各々のエンティティを辞書的に定義する文を抽出します。

定義文の例

英語における定義文は、概ね以下の形式に従います。

X is a Y that Z.

例えば以下です。

Anarchism is an anti-authoritarian political philosophy that advocates self-governed societies based on voluntary, cooperative institutions and the rejection of hierarchies those societies view as unjust. These institutions are often described as stateless societies, although several authors have defined them more specifically as distinct institutions based on non-hierarchical or free associations. Anarchism holds the state to be undesirable, unnecessary, and harmful.

これらの文は、各Wikipediaページの最初の文として書かれているので、それを利用して抽出します。

抽出スクリプト

まず、enwikiのダンプを取得し、wikiextractorで展開します。

wget https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2 -O dump.bz2
tar xjf dump.bz2
git clone https://github.com/attardi/wikiextractor
cd wikiextractor
python WikiExtractor.py -o extracted ../dump.bz2
cd ..

次に、以下のpythonスクリプトを実行します。

# coding: utf-8
import os
import tqdm
from bs4 import BeautifulSoup

if __name__ == "__main__":
    filepathes = []
    for root, dirs, files in os.walk("./wikiextractor/extracted/"):
        if files and "wiki" in files[0]:
            filepathes += [os.path.join(root, file) for file in files]

    for path in tqdm.tqdm(filepathes):
        with open(path) as f:
            soup = BeautifulSoup(f.read(), "lxml")
        docs = soup.find_all("doc")
        result = [
            doc['title'] + "\t" + doc.get_text().split("\n")[3]
            for doc in docs
        ]
        with open("wiki_definition.txt", "a") as f:
            f.write("\n".join(result))

これで、wiki_definition.txtという定義文一覧が出来上がります。

定義文は何に使えるか

Wikipediaページに対して、何らかのラベルを対応させることができる場合、定義文を特徴量としてラベルを予測する問題として定義できます。

例えば、WikipediaページのDBPedia Instance Typesを予測する問題に置き換えることが可能です。

詳細は以下: https://qiita.com/sugiyamath/items/ef94eb4be5a15b232ef1

また、独自の検索システムを構築しているのであれば、エンティティ名で検索された場合に、そのエンティティの定義文を検索結果に表示させることが可能です。

キャプチャ.GIF