ぬゅぼうのPython日記【janome】③ +今後の展望
ぬゅぼうです。
さてjanome利用に際した記事の3回目ですが、今回はこれまでの勉強を踏まえて
③janomeを使いやすい形に関数化する作業に入ります。
…できました。
というかあらかじめできていたものがコチラになります。(3分クッキングメソッド)
from janome.tokenizer import Tokenizer
t=Tokenizer()
def janome(argument):
l=[]
for token in t.tokenize(argument):
token=tuple(str(token).replace("\t",",").split(","))
l.append(token)
return tuple(l)
いやあ書けたはいいもののコレのどこを記事としてコンテンツ化するか悩んでたんですよね…
とはいえもうこれ以上寝かせててもしょうがねぇなと思ってお腹くくって出しちゃいます。
一行目から。
from janome.tokenizer import Tokenizer
t=Tokenizer()
まず最初にimportします。
それとt=Tokenizer()を関数内に入れちゃうと、たくさんの文章をこの関数で処理するとき
ループで短時間にグルングルン回すと重くなって落ちちゃう(memory error)ことが多々あったので関数外の地の文のとこに書いちゃいます。(表現それであってんのか)
def janome(argument):
l=[]
for token in t.tokenize(argument):
token=tuple(str(token).replace("\t",",").split(","))
l.append(token)
return tuple(l)
こっからは特に言うべきこともない感じなんですが…ぶっちゃけループ部分は僕も参考にしたコードをほぼコピっただけなのでね…
token=tuple(str(token).replace("\t",",").split(","))
個人的にはこの行の一回strにしてから処理するの僕もよくやります。文字列として処理してからast.literal_evalとかね
ちなみにtokenと出力のlをtupleにしてるのはなんとなくの趣味です。
特に理由はないのですがイミュータブルな方が安心かなあと思ってしまいまして。
さて、これで出来上がった関数に引数を食わせてみると…
print(janome('おいしいきのこ'))
≫(('おいしい', '形容詞', '自立', '*', '*', '形容詞・イ段', '基本形', 'おいしい', 'オイシイ', 'オイシイ'), ('きのこ', '名詞', '一般', '*', '*', '*', '*', 'きのこ', 'キノコ', 'キノコ'))
成功ですね。
問題なく形態素を解析できてます。
janome関数を使っての今後の展望
さあココからが本題ですよ。
日本語の文章を形態素解析することができるようになったのでいよいよ自然言語処理的な方面に動けますね。
まずコレを使って作りたいのは、
似た要素を持つ単語をグループごとに分類する関数です。
例えば…
('野菜', '名詞', '一般', '*', '*', '*', '*', '野菜', 'ヤサイ', 'ヤサイ')
('きのこ', '名詞', '一般', '*', '*', '*', '*', 'きのこ', 'キノコ', 'キノコ')
この2つの単語、読み方とか原型に関係ない、indexで言うと[1:7]の範囲が
'名詞', '一般', '*', '*', '*', '*'
で共通していますよね。
ここが共通しているということは、
『文章内での役割やポジションが似通っている』
ってことじゃないかなと。
きのこがある
という文章のきのこの部分を[1:7]が共通している野菜に置き換えても、
野菜がある
違和感のない文章として成立するんですよね。
ところが…
[1:7]が共通していない全然違う単語を入れると、
(例として『走る』とします。)
('走る', '動詞', '自立', '*', '*', '五段・ラ行', '基本形', '走る', 'ハシル', 'ハシル')
'名詞', '一般', '*', '*', '*', '*'
'動詞', '自立', '*', '*', '五段・ラ行', '基本形'
([1:7]が全然違います。)
走るがある
…ん??
となりますよね。
ここで仮に[1:7]が【'名詞', '一般', '*', '*', '*', '*'】のパターンを持つ単語をひっくるめて
Aグループと名付けましょう。
すると先ほどの文章の構造上、変数としてこのグループを使えるようになります。
【Aグループ】がある
この文章構造には【Aグループ】に分類される([1:7]が一致する、あるいは共通項が多い)単語が代入できるわけです。
('シメジ', '名詞', '一般', '*', '*', '*', '*', 'シメジ', 'シメジ', 'シメジ')
('マツタケ', '名詞', '一般', '*', '*', '*', '*', 'マツタケ', 'マツタケ', 'マツタケ')
('キクラゲ', '名詞', '一般', '*', '*', '*', '*', 'キクラゲ', 'キクラゲ', 'キクラゲ')
シメジがある
マツタケがある
キクラゲがある
こんな具合ですね。
このノリでバンバン単語を分類してグループをバリバリ増やせばほぼ全ての文章を
単語の代替が可能なパターン構造に変換
できる気がしてきませんか??
…はい。コレをやります。
じゃあコレをできる関数をあらかじめword_classification関数と名付けておきましょう。

やや長くはあるが。
まあ名前はのちのちどうにかするか。
それでは次回以降この関数の内容を考えていきましょう。
というか考えて書き上がったコードを備忘録的に解説していく記事になりそうですが…
まあそれもまたヨシ!!
また次回!!