Python & Sudachiで日本語の形態素解析してみよう 対決の巻き

  • #技術ブログ 

こんにちわ、またまた、2か月振りの登場となりました、うえピーです。
今回も在宅でのブログ更新となっております。

引き続き、日本語形態素解析シリーズということで、今回はSudachi君と私のどちらがより、日本語を理解しているのか対決してみようと思います。
※Python&Sudachi環境のセットアップについては、前回のブログ「Python & Sudachiで日本語の形態素解析してみよう」をご参照下さい。

それでは、今回の対決方法です。
まず、下記の参考図書「国語のおさらい」に出てくる例文(うえピーチョイス)を、Sudachi君に形態素解析してもらいます。
意味分割、割り当てられた品詞に対して、同じく「国語のおさらい」によって中学レベルの知識を獲得したうえピーに間違いを指摘されなければ、Sudachi君の勝ち、指摘できればうえピーの勝ちとします。ただし、あくまで中学レベルのチェック者なので、間違いに気づかない可能はご容赦下さいませ。
※参考図書(なんで中学生の時にちゃんと学ばなかったんだろう・・・、心に染みます。)

まずは、事前準備。分割モードは’C’で。

In [1]: from sudachipy import tokenizer
In [2]: from sudachipy import dictionary
In [3]: tokenizer_obj = dictionary.Dictionary().create()
In [4]: mode = tokenizer.Tokenizer.SplitMode.C

第一問、まずは様子見レベル。まさか、用言の活用如きで躓くことはあるまいな。

In [5]: [(m.surface(),m.part_of_speech()) for m in tokenizer_obj.tokenize("これ以上食べれば、お腹が苦しくなってしまう。",mode)]
Out[5]:
[('これ', ['代名詞', '*', '*', '*', '*', '*']),
 ('以上', ['名詞', '普通名詞', '副詞可能', '*', '*', '*']),
 ('食べれ', ['動詞', '一般', '*', '*', '下一段-バ行', '仮定形-一般']),
 ('ば', ['助詞', '接続助詞', '*', '*', '*', '*']),
 ('、', ['補助記号', '読点', '*', '*', '*', '*']),
 ('お腹', ['名詞', '普通名詞', '一般', '*', '*', '*']),
 ('が', ['助詞', '格助詞', '*', '*', '*', '*']),
 ('苦しく', ['形容詞', '一般', '*', '*', '形容詞', '連用形-一般']),
 ('なっ', ['動詞', '非自立可能', '*', '*', '五段-ラ行', '連用形-促音便']),
 ('て', ['助詞', '接続助詞', '*', '*', '*', '*']),
 ('しまう', ['動詞', '非自立可能', '*', '*', '五段-ワア行', '終止形-一般']),
 ('。', ['補助記号', '句点', '*', '*', '*', '*'])]

ほう、なるほど。”しまう”は、細かくは”補助動詞”だと思うのだけど、「国語のおさらい」では登場しないから、動詞でOKとしましょう。
Sudachi君、1勝。まぁ、これは様子見なんで。(ただし、お前の弱点は見抜いたぞ。)

第二問、ここで早速、弱点を突く!!お前に助動詞の判定が出来るか!!!
(私は、助動詞と補助動詞の区別は未だにつかない時があります。どうせお前もそうなんだろ。)

In [6]: [(m.surface(),m.part_of_speech()) for m in tokenizer_obj.tokenize("簡単な問題なら答えられる。",mode)]
Out[6]:
[('簡単', ['形状詞', '一般', '*', '*', '*', '*']),
 ('な', ['助動詞', '*', '*', '*', '助動詞-ダ', '連体形-一般']),
 ('問題', ['名詞', '普通名詞', '一般', '*', '*', '*']),
 ('なら', ['助動詞', '*', '*', '*', '助動詞-ダ', '仮定形-一般']),
 ('答え', ['動詞', '一般', '*', '*', '下一段-ア行', '未然形-一般']),
 ('られる', ['助動詞', '*', '*', '*', '助動詞-レル', '終止形-一般']),
 ('。', ['補助記号', '句点', '*', '*', '*', '*'])]

ほほう、(やるな・・・、結構難問だと思うのだけれど。)

第三問、趣向を変えて連体詞。(私は、存在をよく忘れる。)

In [7]: [(m.surface(),m.part_of_speech()) for m in tokenizer_obj.tokenize("彼には大きな夢がある。",mode)]
Out[7]:
[('彼', ['代名詞', '*', '*', '*', '*', '*']),
 ('に', ['助詞', '格助詞', '*', '*', '*', '*']),
 ('は', ['助詞', '係助詞', '*', '*', '*', '*']),
 ('大きな', ['連体詞', '*', '*', '*', '*', '*']),
 ('夢', ['名詞', '普通名詞', '一般', '*', '*', '*']),
 ('が', ['助詞', '格助詞', '*', '*', '*', '*']),
 ('ある', ['動詞', '非自立可能', '*', '*', '五段-ラ行', '終止形-一般']),
 ('。', ['補助記号', '句点', '*', '*', '*', '*'])]

こやつ、できる。(この時点で私より・・・)

第四問、感動詞ってどうなんだ?

In [7]: [(m.surface(),m.part_of_speech()) for m in tokenizer_obj.tokenize("こんにちは、お久しぶりです。",mode)]
Out[7]:
[('こんにちは', ['感動詞', '一般', '*', '*', '*', '*']),
 ('、', ['補助記号', '読点', '*', '*', '*', '*']),
 ('お', ['接頭辞', '*', '*', '*', '*', '*']),
 ('久しぶり', ['名詞', '普通名詞', '一般', '*', '*', '*']),
 ('です', ['助動詞', '*', '*', '*', '助動詞-デス', '終止形-一般']),
 ('。', ['補助記号', '句点', '*', '*', '*', '*'])]

まぁ、これはちょろいか。

第五問、接続詞は厳しいんじゃない?

In [8]: [(m.surface(),m.part_of_speech()) for m in tokenizer_obj.tokenize("コーヒーを飲みますか、それとも紅茶にしますか。",mode)]
Out[8]:
[('コーヒー', ['名詞', '普通名詞', '一般', '*', '*', '*']),
 ('を', ['助詞', '格助詞', '*', '*', '*', '*']),
 ('飲み', ['動詞', '一般', '*', '*', '五段-マ行', '連用形-一般']),
 ('ます', ['助動詞', '*', '*', '*', '助動詞-マス', '終止形-一般']),
 ('か', ['助詞', '終助詞', '*', '*', '*', '*']),
 ('、', ['補助記号', '読点', '*', '*', '*', '*']),
 ('それ', ['代名詞', '*', '*', '*', '*', '*']),
 ('と', ['助詞', '格助詞', '*', '*', '*', '*']),
 ('も', ['助詞', '係助詞', '*', '*', '*', '*']),
 ('紅茶', ['名詞', '普通名詞', '一般', '*', '*', '*']),
 ('に', ['助詞', '格助詞', '*', '*', '*', '*']),
 ('し', ['動詞', '非自立可能', '*', '*', 'サ行変格', '連用形-一般']),
 ('ます', ['助動詞', '*', '*', '*', '助動詞-マス', '終止形-一般']),
 ('か', ['助詞', '終助詞', '*', '*', '*', '*']),
 ('。', ['補助記号', '句点', '*', '*', '*', '*'])]

どうだー!”それとも”は、接続詞じゃい!!1勝~!
とりあえず、それともは紛らわしいやつっぽいので、一般的な接続詞は判定できるか確認と。

In [9]: [(m.surface(),m.part_of_speech()) for m in tokenizer_obj.tokenize("必死に練習した。だから、試合に勝つことができた。",mode)]
Out[9]:
[('必死', ['形状詞', '一般', '*', '*', '*', '*']),
 ('に', ['助動詞', '*', '*', '*', '助動詞-ダ', '連用形-ニ']),
 ('練習', ['名詞', '普通名詞', 'サ変可能', '*', '*', '*']),
 ('し', ['動詞', '非自立可能', '*', '*', 'サ行変格', '連用形-一般']),
 ('た', ['助動詞', '*', '*', '*', '助動詞-タ', '終止形-一般']),
 ('。', ['補助記号', '句点', '*', '*', '*', '*']),
 ('だ', ['助動詞', '*', '*', '*', '助動詞-ダ', '終止形-一般']),
 ('から', ['助詞', '接続助詞', '*', '*', '*', '*']),
 ('、', ['補助記号', '読点', '*', '*', '*', '*']),
 ('試合', ['名詞', '普通名詞', 'サ変可能', '*', '*', '*']),
 ('に', ['助詞', '格助詞', '*', '*', '*', '*']),
 ('勝つ', ['動詞', '一般', '*', '*', '五段-タ行', '連体形-一般']),
 ('こと', ['名詞', '普通名詞', '一般', '*', '*', '*']),
 ('が', ['助詞', '格助詞', '*', '*', '*', '*']),
 ('でき', ['動詞', '非自立可能', '*', '*', '上一段-カ行', '連用形-一般']),
 ('た', ['助動詞', '*', '*', '*', '助動詞-タ', '終止形-一般']),
 ('。', ['補助記号', '句点', '*', '*', '*', '*'])]

ふーん、接続詞は苦手なんだね。

第六問、最終問題です、私も苦手な形容動詞と名詞+助動詞の区別。

In [10]: [(m.surface(),m.part_of_speech()) for m in tokenizer_obj.tokenize("些細なことにこだわる。",mode)]
Out[10]:
[('些細', ['名詞', '普通名詞', '形状詞可能', '*', '*', '*']),
 ('な', ['助動詞', '*', '*', '*', '助動詞-ダ', '連体形-一般']),
 ('こと', ['名詞', '普通名詞', '一般', '*', '*', '*']),
 ('に', ['助詞', '格助詞', '*', '*', '*', '*']),
 ('こだわる', ['動詞', '一般', '*', '*', '五段-ラ行', '終止形-一般']),
 ('。', ['補助記号', '句点', '*', '*', '*', '*'])]

よっしゃー、引っ掛かりおったー!2勝目!!

最終問題は、ポイント3倍ということで、4対4。引き分け!!ゲームセット。
いい試合だったー。

まぁ、助詞とか助動詞と同じかたちがつく品詞の判定は苦手、というよりは、大抵、助詞とか助動詞に判定しておいた方が正答率は上がるんだろうな。
とはいえ、接続詞は辞書登録で何とかなりそうなもんだけど。フルバージョンの辞書入れると違うのかな。次回はフルバージョンと再戦してみようかな。

というわけで、また次回。