More than 5 years have passed since last update.
日本語NLPライブラリGiNZAのすゝめ
日本語NLPライブラリGiNZAのすゝめ
この記事について
本記事は、日本語の自然言語処理ライブラリである GiNZA の紹介記事です。
Qiitaの記事 と GiNZA examples - GitHub の二箇所に同じものを公開しています。
想定する読者
- 自然言語処理ってどんなことができるの?という初学者の方
- 筆者もまだまだ初学者ですが GiNZA は簡単にすごいことができるのでぜひ見ていってください。
- Pythonを学びたての方やこれから学ぼうとしている方
- Python学習のモチベーションになると思います。
-
MeCab などの形態素解析器を使ったことはあるが GiNZA は初めて聞いたという方
- 簡単に比較できるものではありませんが新たに GiNZA を知る価値はあると思います。
GiNZAとは
GiNZA は 日本語の 自然言語処理ライブラリです。
もともと spaCy という自然言語処理のフレームワークがあり、英語など主要な言語に対応していました。 GiNZA は言わば spaCy の日本語対応版です。
詳細については GiNZAの公開ページ をご覧ください。
GiNZAを動かす
ここで紹介するコードは GitHubホストランナーの仮想環境 のubuntu-latest, macos-latestとPython 3.6, 3.7, 3.8の組み合わせ(計6通り)で動作検証しています。
動作検証結果
👁 TestGinzaExamples
(GiNZA Examples 本体)
👁 TestOther
(リンク切れのチェックなど)
セットアップ
オンライン
Pythonに親しみのない方や手っ取り早く動作環境がほしい方向けにオンラインの実行環境を用意しています。ブラウザで GiNZA examples - Repl.it を開いて Run をクリックしてください。セットアップ完了までに5分程度かかります。
ローカル環境
git clone https://github.com/poyo46/ginza-examples.git
cd ginza-examples
poetry install
もし poetry が未導入であれば $ pip install poetry でインストールしてください。
形態素解析
実行
python examples/token_information.py 田中部長に伝えてください。
結果
| i | text | lemma_ | reading_form | pos_ | tag_ | inflection | ent_type_ |
|---|---|---|---|---|---|---|---|
| 0 | 田中 | 田中 | タナカ | PROPN | 名詞-固有名詞-人名-姓 | Person | |
| 1 | 部長 | 部長 | ブチョウ | NOUN | 名詞-普通名詞-一般 | Position_Vocation | |
| 2 | に | に | ニ | ADP | 助詞-格助詞 | ||
| 3 | 伝え | 伝える | ツタエ | VERB | 動詞-一般 | 下一段-ア行,連用形-一般 | |
| 4 | て | て | テ | SCONJ | 助詞-接続助詞 | ||
| 5 | ください | くださる | クダサイ | AUX | 動詞-非自立可能 | 五段-ラ行,命令形 | |
| 6 | 。 | 。 | 。 | PUNCT | 補助記号-句点 |
※結果は見やすいように加工しています。
応用
この解析結果を使って例えば次のようなことができます。
- 文中に含まれる単語から動詞と形容詞の原形を抽出する。
- 文中に含まれる食べ物を抽出してカウントする。
- 文中の個人情報をマスキングする。
テキストを文のリストに分割する
実行
python examples/split_text.py はい、そうです。ありがとうございますよろしくお願いします。
結果
はい、そうです。
ありがとうございます
よろしくお願いします。
依存構造解析・可視化
実行
python examples/displacy.py あのラーメン屋にはよく行く。
結果
Using the 'dep' visualizer
Serving on http://0.0.0.0:5000 ...
ブラウザで http://localhost:5000 を開くと解析結果が表示されます。同時に、サンプルコードでは画像を examples/displacy.svg に保存しています。
文章要約
LexRankアルゴリズムを用いて抽出型要約を実行します。抽出型要約とは、元の文から重要な文を(無加工で)抽出するものです。サンプル文として 『走れメロス』 を用意しました。
実行
python examples/lexrank_summary.py examples/data/run_melos.txt 15
結果
人を、信ずる事が出来ぬ、というのです。
三日のうちに、私は村で結婚式を挙げさせ、必ず、ここへ帰って来ます。
そうして身代りの男を、三日目に殺してやるのも気味がいい。
ものも言いたくなくなった。
そうして、少し事情があるから、結婚式を明日にしてくれ、と頼んだ。
あれが沈んでしまわぬうちに、王城に行き着くことが出来なかったら、あの佳い友達が、私のために死ぬのです。
何をするのだ。
けれども、今になってみると、私は王の言うままになっている。
王は、ひとり合点して私を笑い、そうして事も無く私を放免するだろう。
私を、待っている人があるのだ。
死んでお詫び、などと気のいい事は言って居られぬ。
メロス。
その人を殺してはならぬ。
メロスが帰って来た。
メロスだ。
LexRankアルゴリズムによって抽出された、重要度の高い上位 15 文です。重要度のスコアは一度だけ計算すればよいため、抽出する文の数を変更したい場合は lexrank_scoring の結果を再利用すると速いです。
文の類似度
実行
python examples/similarity.py 今日はとても良い天気です。 昨日の天気は大雨だったのに。 ラーメンを食べました。
結果
| 今日はとても良い天気です。 | 昨日の天気は大雨だったのに。 | ラーメンを食べました。 | |
|---|---|---|---|
| 今日はとても良い天気です。 | 1.0 | 0.9085916084662856 | 0.7043564497093551 |
| 昨日の天気は大雨だったのに。 | 0.9085916084662856 | 1.0 | 0.7341796340817486 |
| ラーメンを食べました。 | 0.7043564497093551 | 0.7341796340817486 | 1.0 |
※結果は見やすいように加工しています。
ライセンス
GiNZA
GiNZA そのものは MIT License で利用できます。詳しくは ライセンス条項 をご覧ください。
GiNZA examples
筆者の Qiitaの記事 および GiNZA examples - GitHub も同様に MIT License で利用できます。
注意事項
- GiNZA を利用できる言語はPythonのみです。しかしフレームワークである spaCy にはJavaScript版やR版など Python以外の言語での実装 があるため、すごい人たちが移植してくれることを期待します。
- 単語のネガティブ・ポジティブを数値化する Token.sentiment は現時点で実装されていませんが、 GiNZA 開発者の方から直々にコメントをいただき、今後実装を計画していただけるとのことです。
ご意見・ご要望など
ご意見・ご要望などは随時受け付けています。 Qiitaの記事 へコメント、または GitHubのIssues へ投稿をお願いします。
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
