##内容
前回の流れで、MeCabをもう少し活用したい。分かち書きでは細分化され過ぎていた。MeCabを用いて分節分けのようなことを行っていく。CabochaやKNPがあるよーっていうのは知らないこととする(何度でも言うぞ、黄色いB-boy折角のMeCabを使いたいのだ)。形態素解析は使っていないので、形態素解析して付属語(助詞、助動詞)は前の言葉にくっつけるという方針でやってみる。
##付属語の連結
結果から言うとMeCabは使わなかった。表層形と品詞だけが必要なので、janomeの方が簡潔と判断した。ただ、MeCabでも色々試し、DataFrameに入れる記事とかも読み、for分で変に回してしまいメモリーエラーにもなったので、そこそこ楽しめた
下記のコードで付属語を連結することによって、分割された言葉の長さが平均2.96となった(分かち書きでは2.16)。
from janome.tokenizer import Tokenizer
with open("./gennama.txt","r") as f:
data = f.read()
tokenizer = Tokenizer()
tokens = tokenizer.tokenize(data)
surface_list = []
part_of_speech_list = []
for token in tokens:
surface_list.append(token.surface)
part_of_speech_list.append(token.part_of_speech.split(",")[0])
text_data = []
for i in range(len(surface_list)):
if part_of_speech_list[i] == "記号":
continue
elif part_of_speech_list[i] == "助詞" or part_of_speech_list[i] == "助動詞":
row = text_data.pop(-1) + surface_list[i]
else:
row = surface_list[i]
text_data.append(row)
これで前回のように、入力データにどの母音の並びが多いかの順位付けし、それが含まれている言葉を出力させた。出力結果は分かち書きの時より多くなったが、実用性は見いだせていない。やはりN-gramが現状最適である、語順も残り、本来区切らないところで区切るため、繋げれば韻というのも検出できる。
ここであることに気付く。N-gram前に漢字をひらがな…もとい、漢字を読みへ変換しておけばN-gramのバリエーションが増えそうだ。(漢字をひらがなはkakasiで出来てしまう)そういえば、先程MeCabで形態素解析したときに、「読み」の項目があったぞ。MeCabを使おう。
##読み方のデータへ変換
import MeCab
with open("./gennama.txt","r") as f:
data = f.read()
yomi_data = ""
mecab = MeCab.Tagger("-Ochasen")
lines = mecab.parse(data).split("\n")
for line in lines:
if line.split("\t")[0] == "EOS":
break
else:
yomi_data += line.split("\t")[1]
「下町」→「したまち」→「iaai」となり、4母音を4文字で表せている。では、「瞬間」→「しゅんかん」→「ua」のような場合はどうだろう?2母音を5文字で表すこととなっている。読み方でN文字分割すれば「下/町」しか出来なかったところが「したま/ち」なども可能になる。しかし、「しゅんかん」は無駄に長くなってしまう。では、母音データにした後にN-gramを使用するか?そのデータにインデックスを割り当てたところで表層形が取り出せない。「下町」の「aa」の並びが検出されないことを良しとは出来ない。改良案はすぐ思いつかないが、ここはよく考えたい。
##今後の方針
一つはスコアの付け方を色々加算するのも良いかもしれない。例えば、子音を残しても合致していたら加算するなど、複数のスコアを合算するようなやり方もアリだ。それであれば、「冷蔵庫」を(レイゾウコ、レーゾーコ)のような扱いも可能と思われる。
もう一つは、ノードに分割したwordを、エッジにscoreを用いてグラフを描写してみようと思う。実は、分割方法がスペース区切りしか出来ない時にやってみたのだが、(媒介中心性にテーマが来るのでは?予想で)思った結果にならなかった。networkx
を一から勉強し直してみようと思う。(次に投稿する日がいつになるか不安だ。ただ、検索エンジンの勉強をしていてPageRankや単語の距離のスコアの合算を見て、そのやり使えるかも?と思えたので、勉強します)