Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【Python】janomeで形態素解析をしてもらう

こんばんは葛の葉です。

Pythonにはjanomeという形態素解析が出来るモジュールがあるみたいです。

mocobeta.github.io

形態素解析wikipediaを参照してください。

ja.wikipedia.org

青空文庫にある「坊っちゃん」の一文を形態素分析してみます。

www.aozora.gr.jp

親譲《おやゆず》りの無鉄砲《むてっぽう》で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰《こし》を抜《ぬ》かした事がある。なぜそんな無闇《むやみ》をしたと聞く人があるかも知れぬ。別段深い理由でもない。新築の二階から首を出していたら、同級生の一人が冗談《じょうだん》に、いくら威張《いば》っても、そこから飛び降りる事は出来まい。弱虫やーい。と囃《はや》したからである。小使《こづかい》に負ぶさって帰って来た時、おやじが大きな眼《め》をして二階ぐらいから飛び降りて腰を抜かす奴《やつ》があるかと云《い》ったから、この次は抜かさずに飛んで見せますと答えた。

これをboc.txtとして保存し、pythonではこれをロードして使ってみます。

from janome.tokenizer import Tokenizer

import re

t = Tokenizer()

moji = ""

with open("./boc.txt", mode="r", encoding="utf-8") as text:
  moji = text.read()

moji = re.sub("《[^》]+》", "", moji)
moji_list = moji.split("。")
moji_list.pop()

s = [t.tokenize(sentence) for sentence in moji_list]

# 全文の形態素解析の表示は辛いので一文だけという意味で[0]
for i in s[0]:
  print(i)

"""
親譲り  名詞,一般,*,*,*,*,親譲り,オヤユズリ,オヤユズリ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
無鉄砲  名詞,一般,*,*,*,*,無鉄砲,ムテッポウ,ムテッポー
で      助詞,格助詞,一般,*,*,*,で,デ,デ
小      接頭詞,名詞接続,*,*,*,*,小,ショウ,ショー
供      名詞,サ変接続,*,*,*,*,供,キョウ,キョー
の      助詞,連体化,*,*,*,*,の,ノ,ノ
時      名詞,非自立,副詞可能,*,*,*,時,トキ,トキ
から    助詞,格助詞,一般,*,*,*,から,カラ,カラ
損      名詞,一般,*,*,*,*,損,ソン,ソン
ばかり  助詞,副助詞,*,*,*,*,ばかり,バカリ,バカリ
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
いる    動詞,非自立,*,*,一段,基本形,いる,イル,イル
"""

まず、ルビが不要なので正規表現で削除します。また、一文ずつのほうが解析として見やすいので一文にします。

tokenizeメソッドを使うことで文字列を形態素解析し、形態素を要素としてリストとして出力します。本当にこれ無料で使っていいのか?って思う。

わかち書きもしてもらう

janomeにはわかち書きにしてくれるモードもついているので、それも使ってみます。

ja.wikipedia.org

from janome.tokenizer import Tokenizer

import re

t = Tokenizer()

moji = ""

with open("./boc.txt", mode="r", encoding="utf-8") as text:
  moji = text.read()

moji = re.sub("《[^》]+》", "", moji)
moji_list = moji.split("。")
moji_list.pop()

s = [t.tokenize(sentence, wakati=True) for sentence in moji_list]

# 全文の形態素解析の表示は辛いので一文だけという意味で[0]
print(s[0])
"""
['親譲り', 'の', '無鉄砲', 'で', '小', '供', 'の', '時', 'から', '損', 'ばかり', 'し', 'て', 'いる']
"""