無題の画像

PythonとMATLABによる自然言語処理の極々簡単な比較

結局フリーでできんもんかとどうしても考えてしまう。

そこでまずはPythonで日本語文章をtoken化

中途半端は良くないと知りつつもいろいろ調べてtokenizedできるまでなったので参考コードを記載する。

まず、pythonではライブラリインポートが必要なのでそこは以下のサイトを参考にした。あと実行環境はcolaboratry

そんで実際に上記から引用したcode

# Install; note that the prefix "!" is not needed if you are running in a terminal
!pip install stanfordnlp

# Import the package
import stanfordnlp

stanfordnlp.download('ja', force=True)

​ここまででインポートと日本語オプションのダウンロード完了

そんで次に、実際にインポートして文章のtokenized

tokenizer = stanfordnlp.Pipeline(lang="ja", treebank="ja_gsd", use_gpu=True)
sample = "たかしは、太郎に「明日遊びに行く」と話した"
result = tokenizer(sample)
tokens = [word.text for sent in result.sentences for word in sent.words]
result.sentences[0].print_tokens()
print(tokens)

結果 Python stanfordnlp

<Token index=1;words=[<Word index=1;text=たかし;lemma=たかしむ;upos=NOUN;xpos=_;feats=_;governor=13;dependency_relation=nsubj>]>
<Token index=2;words=[<Word index=2;text=は;lemma=は;upos=ADP;xpos=_;feats=_;governor=1;dependency_relation=case>]>
<Token index=3;words=[<Word index=3;text=、;lemma=、;upos=PUNCT;xpos=_;feats=_;governor=1;dependency_relation=punct>]>
<Token index=4;words=[<Word index=4;text=太郎;lemma=太郎;upos=PROPN;xpos=_;feats=_;governor=10;dependency_relation=iobj>]>
<Token index=5;words=[<Word index=5;text=に;lemma=に;upos=ADP;xpos=_;feats=_;governor=4;dependency_relation=case>]>
<Token index=6;words=[<Word index=6;text=「;lemma=「;upos=PUNCT;xpos=_;feats=_;governor=7;dependency_relation=punct>]>
<Token index=7;words=[<Word index=7;text=明日;lemma=明日;upos=NOUN;xpos=_;feats=_;governor=8;dependency_relation=compound>]>
<Token index=8;words=[<Word index=8;text=遊び;lemma=遊び;upos=NOUN;xpos=_;feats=_;governor=10;dependency_relation=iobj>]>
<Token index=9;words=[<Word index=9;text=に;lemma=に;upos=ADP;xpos=_;feats=_;governor=8;dependency_relation=case>]>
<Token index=10;words=[<Word index=10;text=行く;lemma=行く;upos=VERB;xpos=_;feats=_;governor=13;dependency_relation=acl>]>
<Token index=11;words=[<Word index=11;text=」;lemma=」;upos=PUNCT;xpos=_;feats=_;governor=10;dependency_relation=punct>]>
<Token index=12;words=[<Word index=12;text=と;lemma=と;upos=ADP;xpos=_;feats=_;governor=10;dependency_relation=case>]>
<Token index=13;words=[<Word index=13;text=話し;lemma=話す;upos=VERB;xpos=_;feats=_;governor=0;dependency_relation=root>]>
<Token index=14;words=[<Word index=14;text=た;lemma=た;upos=AUX;xpos=_;feats=_;governor=13;dependency_relation=aux>]>
['たかし', 'は', '、', '太郎', 'に', '「', '明日', '遊び', 'に', '行く', '」', 'と', '話し', 'た']

最後の行でちゃんとtokenizedされている。

pythonは慣れていないので、出力するためのデータ構造が直観的にわからないので、どのように出力すればよいかが分からず非常に困惑。spyder使えばもうちょい楽に構造わかるようになるのか?あとライブラリの仕様が分からないのも結構痛手に感じるが、そこらへんは慣れだろうか。というか慣れなんて言ったら、この世のものは全部慣れなんだから当たり前だろという感じは否めん。コード自体もword.textという関数だか変数だか分らんものが急に出てきたのも大いに困惑を呼ぶ。これはpythonの仕様なのだろうか?まぁここら辺は基礎ができていないからわからないのだろう。あとfor sent inの部分も正直どういったfor roopになっているのかパッとわからない。

一応CoreNLPだけど、参考までにdependencyの意味に関して

次にMATLAB

同様の文を記載。面倒なので、一気に出力


具体的な違いとしては、分類化に違いがあるのではないだろうか?

意味分類に関してはまだあいまいな点があるが、少なくともmatlabのtokendetails関数で呼び出されるentryの結果では「たかし」は人に分類はされていない。さらに、「たかし」はlemma(辞書形式単語)では「たかい」に分類されてしまい形容詞分類になってしまっている。この点pythonではuposがnoun(名詞)となっているため、matlabよりは正確に分類できているようだ。

一応「たかし」⇒「タカシ」として再解析。

結果 MATLAB

結果 Stanfordnlp

となり両方とも固有名詞と分類されOK、精度がいいのはstanfordnlpの方だろうか。

ただ、記載は圧倒的にmatlabなんだけどね。


この記事が気に入ったらサポートをしてみませんか?