のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Pythonで自然言語処理のタスクをやってみる。

Sponsored Links

皆さんこんにちは
お元気ですか。アドベントカレンダー真っ盛りですね。
本日は「python Advent Calendar 2017」のアドベントカレンダー第5日です。

qiita.com

自然言語処理には様々なライブラリ(NLTKやCoreNLP)があります。
せっかくの機会として、本記事では紹介が少ないspaCyを紹介します。

spaCy

spaCyとは

spaCyはPythonの発展的な自然言語処理のライブラリです。
実際に使われていることを想定しており、英語、ドイツ語、フランス語、スペイン語に対応しています。
トークナイザーは日本語もあるとのこと(確かJanomeで動作します)。

github.com

次のリンク先には他の自然言語処理ライブラリの
アルゴリズムの観点や精度(Dependency parsing、Named entity comparison)が
載っており、他のライブラリとどのような点が違うのかを確認できます。

spacy.io

インストール

pip install spacy

spaCyで遊んでみる

spaCyですが、日本語対応が用意されています。
ただ、残念ながら日本語に対応したモデルがないため、
まだ本格的な日本語解析は難しいのかなと感じています。

それは置いておいて、本日はspaCyの機能紹介をしたいので、
既に準備されている英語のモデルを使います。

まずは、英語解析の準備をします。

import spacy
nlp = spacy.load('en')
doc1 = nlp(u"this is a pen.")

文章を単語ごとに区切る

文章を単語ごとに区切ることが可能です。

for token in doc1:
    print (token)

結果はスペースで区切られている次の通りです。

this
is
a
pen
.

文章を文ごとに分ける

簡単そうな例ですが、文章を文ごとに分解します。
英語だと、ピリオドによる分割になるでしょうか。

doc2 = nlp(u"This is a pen. That is an apple")
for sent in doc2.sents:
    print (sent)

出力結果です。「.」による分割ができています。

This is a pen.
That is an apple

固有表現抽出(Named Entity Recognizer)

固有表現抽出は文章の中から固有の表現を発見する技術です。

ent_doc = nlp("Rami Eid is studying at Stony Brook University in New York")
for ent in ent_doc.ents:
    print (ent, ent.label, ent.label_)

残念ながらNew Yorkが出力できていません。
固有表現が何かだけではなく、どんな固有表現(人なのか、組織なのか)かも抽出できています。

Rami Eid 377 PERSON
Stony Brook University 380 ORG

名詞フレーズの抽出

フレーズの抽出も可能です。

noun_chunk_test = nlp(u"Natural language processing (NLP) deals with the application of computational models to text or speech data.")
for noun_chunk in noun_chunk_test.noun_chunks:
    print (noun_chunk)

出力結果です。これもそれっぽいですね。

Natural language processing (NLP) deals
the application
computational models
text or speech data

文章間の距離を計算する。

文書のベクトルを計算します。
word2vecに類似したアルゴリズムです。実装は非常にシンプルで
apple.vectorをすれば、文書のベクトルを取得できます。
ベクトルを表示すると標準出力が長くなるので、代わりにshapeを実行してみます。

apple.vector.shape

また、2ベクトル間を計算し、類似度を算出できます。

udon = nlp(u"Udon and oranges are not similar.")
apple = nlp(u"Apples and oranges are similar. Boots and hippos aren't.")
udon.similarity(apple)

最後に

今回は自然言語処理のライブラリを紹介しました。
まだ、日本人向けには難しい状態でありますが、開発が進んでいるので、試しに使ってみてはいかがでしょうか。