ナード戦隊データマン

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

多言語エンティティリンキングを誰でも実行できるようにした

前回、多言語エンティティリンキングの訓練コードの一部を公開しましたが、今回はメモリが十分にあり、スペックが十分あれば実行できるようにしておきました。

GitHub - sugiyamath/e2e_EL_multilingual_experiments: the experiments of an end to end method for multilingual entity linking

事前準備

1. LASERをインストール

以下のREADMEを読んでください。

2. laserencoderのインストール

以下。

3. MeCab, neologdのインストール

以下。

データのダウンロード

git clone https://github.com/sugiyamath/e2e_EL_multilingual_experiments
cd run_anyway
pip install googledrivedownloader
pip install -r requirements.txt
python download_data.py
cd modules

modules内のpredictorの実行

python predictor.py  # または日本語はpredictor_ja.py

文を入力して実行

[predictor.py]

threshold>0.5
sent>Python is an interpreted, high-level, general-purpose programming language. Created by Guido van Rossum and first released in 1991, Python's design philosophy emphasizes code readability with its notable use of significant whitespace. Its language constructs and object-oriented approach aims to help programmers write clear, logical code for small and large-scale projects.

[{'entity': 'Python_(programming_language)', 'mention': 'Python', 'word_index': (0, 1)}, {'entity': 'Python_(programming_language)', 'mention': 'Python', 'word_index': (22, 23)}, {'entity': 'Programming_language', 'mention': 'programming language', 'word_index': (8, 10)}, {'entity': 'General-purpose_programming_language', 'mention': 'general-purpose programming language', 'word_index': (7, 10)}, {'entity': 'Guido_van_Rossum', 'mention': 'Guido van Rossum', 'word_index': (13, 16)}]

[predictor_ja.py]

threshold>0.2
sent>Django は Apache 2 で mod python を使って、あるいは任意の WSGI 準拠のウェブサーバで動作させることができる。NginxとuWSGIでも動作が可能となっている。 Django は FastCGI サーバを起動することができ、FastCGI をサポートする任意のウェブサーバのバックエンドで使用することができる。

[{'entity': 'Django_(web_framework)', 'mention': 'Django', 'word_index': (0, 1)}, {'entity': 'Web_Server_Gateway_Interface', 'mention': 'WSGI', 'word_index': (14, 15)}, {'entity': 'Web_server', 'mention': 'ウェブサーバ', 'word_index': (17, 18)}, {'entity': 'Nginx', 'mention': 'Nginx', 'word_index': (26, 27)}, {'entity': 'UWSGI', 'mention': 'uWSGI', 'word_index': (28, 29)}, {'entity': 'Django_(web_framework)', 'mention': 'Django', 'word_index': (39, 40)}, {'entity': 'FastCGI', 'mention': 'FastCGI', 'word_index': (41, 42)}, {'entity': 'Server_(computing)', 'mention': 'サーバ', 'word_index': (42, 43)}, {'entity': 'FastCGI', 'mention': 'FastCGI', 'word_index': (50, 51)}, {'entity': 'Web_server', 'mention': 'ウェブサーバ', 'word_index': (56, 57)}, {'entity': 'Front_and_back_ends', 'mention': 'バックエンド', 'word_index': (58, 59)}]

補足

thresholdは、precisionとrecallのトレードオフを制御するパラメータです。この値が小さいほど、多くのメンションが検出対象になりやすくなります。

word_indexは、トーカナイズされた語のリストのインデックスであり、文字インデックスではありません。

このモデルが「マルチリンガル」である理由は、英語も日本語も同じmodel_wiki_tmp.h5を使っているためです。他の言語に対応するためには、data_processor/build_candidatesディレクトリ内のスクリプトを使ってメンション-エンティティ統計を取って置き換え、その言語に適したトーカナイザを使うだけです。

なお、精度はあまり高くありません。

次は、精度を上げるために言語個別のモデルを訓練した上で、VoxELで5つの言語を評価できたらなーと考えています。