ゴリラと学ぶ「PythonとMeCabで一般名詞を変換」
ゴリたちゴリラ🦍は、ニンゲン👫のつくったぶんしょうをいろいろ参考にして、ゴリラのための文章をつくることがおおいウホ。たとえば、ゴリラのことわざをつくったときにも、ゴリラのせいかつにあったことわざにしたウホ。おおきく形をかえたものもあるけど、「猿も木から落ちる」については「ゴリラも木から落ちる」として、サルをゴリラにかえただけのやつもあったウホ。
ゴリ的には、もっといろいろなものを変換してみたいウホ。でも、いちいち手✋で変換していくのはめんどくさいウホ。ゴリたちも機械🤖にたよって、文章の中の名詞を自動的に変換できるようにしたいウホ!
きょうはそんなもんだいを考えてみるウホ。
もんだい
ある文章のなかの、一般名詞をゴリラに変えたいウホ。
いちいち目で確認して手でなおすのもめんどくさいから、パソコンで機械的にやりたいウホ。
そんなとき、どういうプログラムをくめばいいウホ?
言語はなんでもいいけど、ゴリ的にはPythonでやりたいウホ。
🦍🦍🦍🦍🦍🦍🦍🦍🦍🦍🦍
こたえ
Pythonで機械的に変換していくウホ!変換するためには、形態素解析をするためのエンジン「MeCab」を使うウホ。このMeCabをつかうことで、文を品詞分解(名詞とか動詞とかにわけること)ができるウホ。Python以外にもいろいろなやつでMeCabはつかえるけど、こんかいはゴリ的につかいやすいPythonをつかうウホ。
動作環境: Google colaboratory python3ノートブック(2020/02/16版)
まずはmecab-python3(pypi.org)をインストールするウホ。これをインストールすることで、PythonでMeCabが使えるようになるウホ。
!pip install mecab-python3
変換する文章を準備するウホ。今回変換する文章は、三段論法(Wikipedia)、論理的推論(Wikipedia)から演繹の例、そして人間失格 - 太宰治(青空文庫)から引用してきたウホ。
- 全ての人間は死すべきものである。ソクラテスは人間である。ゆえにソクラテスは死すべきものである。
- 雨がふると芝生は湿る。雨がふっている。したがって、芝生は湿っている。
- 恥の多い生涯を送って来ました。
それらを’sentence_list’としてリスト化するウホ。そのリスト内でループさせて処理していくウホ。
できたコードは下の通りウホ。
import MeCab
sentence_list = ['全ての人間は死すべきものである。ソクラテスは人間である。ゆえにソクラテスは死すべきものである。',
'雨がふると芝生は湿る。雨がふっている。したがって、芝生は湿っている。',
'恥の多い生涯を送って来ました。']
for s in sentence_list:
t = MeCab.Tagger()
sentence = s
sentence_gori = sentence
t_list = t.parse(sentence).split()
noun_list = [t_list[i-1] for i in range(len(t_list)) if t_list[i][0:5] == '名詞,一般']
for noun in noun_list:
sentence_gori = sentence_gori.replace(noun, 'ゴリラ')
print('変換前: ', sentence)
print('変換後: ', sentence_gori)
print('----------------------')
MeCab.Tagger()でsentence(上記の文章)を品詞分解するウホ。そのあと、split()でt_list([‘全て’, ‘名詞,副詞可能,,,,,全て,スベテ,スベテ’, ‘の’, …])として品詞分解の結果と単語のリストを作るウホ。
noun_listでは、内包表記として、‘名詞,一般’という文字列が
品詞分解結果(t_list[i][0:5])にふくまれているとき、
その解析した単語(t_list[i-1])をリスト化するようにしているウホ。つまり、一般名詞をリスト化させているウホ。
そして、noun_listについてループして、各名詞(noun)をゴリラにreplaceしているウホ。
このコードを実行した結果は次のようになるウホ。
変換前: 全ての人間は死すべきものである。ソクラテスは人間である。ゆえにソクラテスは死すべきものである。
変換後: 全てのゴリラは死すべきものである。ソクラテスはゴリラである。ゆえにソクラテスは死すべきものである。
----------------------
変換前: 雨がふると芝生は湿る。雨がふっている。したがって、芝生は湿っている。
変換後: ゴリラがふるとゴリラは湿る。ゴリラがふっている。したがって、ゴリラは湿っている。
----------------------
変換前: 恥の多い生涯を送って来ました。
変換後: ゴリラの多い生涯を送って来ました。
----------------------
一つめに触れると、ソクラテスは固有名詞だから、ゴリラにはならなかったウホ。そのかわりに、人間は一般名詞だから、ゴリラになったウホ。けっかてきに、ソクラテスがゴリラとして扱われているけど、三段論法的にはまちがいじゃないウホ。
ちなみに、こまかい品詞の分け方や、変換する名詞のリストは次のようになるウホ。全部のせるのはややこしいから、ソクラテスとゴリラのやつだけのっけるウホ。
変換前: 全ての人間は死すべきものである。ソクラテスは人間である。ゆえにソクラテスは死すべきものである。
名詞リスト: ['人間', '人間']
['全て', '名詞,副詞可能,*,*,*,*,全て,スベテ,スベテ', 'の', '助詞,連体化,*,*,*,*,の,ノ,ノ', '人間', '名詞,一般,*,*,*,*,人間,ニンゲン,ニンゲン', 'は', '助詞,係助詞,*,*,*,*,は,ハ,ワ', '死す', '動詞,自立,*,*,五段・サ行,基本形,死す,シス,シス', 'べき', '助動詞,*,*,*,文語・ベシ,体言接続,べし,ベキ,ベキ', 'もの', '名詞,非自立,一般,*,*,*,もの,モノ,モノ', 'で', '助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ', 'ある', '助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル', '。', '記号,句点,*,*,*,*,。,。,。', 'ソクラテス', '名詞,固有名詞,人名,姓,*,*,ソクラテス,ソクラテス,ソクラテス', 'は', '助詞,係助詞,*,*,*,*,は,ハ,ワ', '人間', '名詞,一般,*,*,*,*,人間,ニンゲン,ニンゲン', 'で', '助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ', 'ある', '助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル', '。', '記号,句点,*,*,*,*,。,。,。', 'ゆえに', '接続詞,*,*,*,*,*,ゆえに,ユエニ,ユエニ', 'ソクラテス', '名詞,固有名詞,人名,姓,*,*,ソクラテス,ソクラテス,ソクラテス', 'は', '助詞,係助詞,*,*,*,*,は,ハ,ワ', '死す', '動詞,自立,*,*,五段・サ行,基本形,死す,シス,シス', 'べき', '助動詞,*,*,*,文語・ベシ,体言接続,べし,ベキ,ベキ', 'もの', '名詞,非自立,一般,*,*,*,もの,モノ,モノ', 'で', '助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ', 'ある', '助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル', '。', '記号,句点,*,*,*,*,。,。,。', 'EOS']
うえでも触れた通り、一般名詞の’人間’はみんなゴリラに変換されているけど、固有名詞の’ソクラテス’はゴリラに変換されていないことがわかるウホ。
こたえ: 上記の通り
無事に文章中の名詞をゴリラに変えることができたウホ。一般名詞と固有名詞でどっちをかえるかで結果もかわってきそうだけど、とりあえず一般名詞については変換できるようになったウホ。
これからかいりょうしていって、ゴリラのことわざをつくるための機械を作っていきたいウホ!