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。引き分け!!ゲームセット。
いい試合だったー。
まぁ、助詞とか助動詞と同じかたちがつく品詞の判定は苦手、というよりは、大抵、助詞とか助動詞に判定しておいた方が正答率は上がるんだろうな。
とはいえ、接続詞は辞書登録で何とかなりそうなもんだけど。フルバージョンの辞書入れると違うのかな。次回はフルバージョンと再戦してみようかな。
というわけで、また次回。