LoginSignup
0
0

More than 3 years have passed since last update.

韻を扱いたいpart3

Posted at

内容

前回の流れで、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や単語の距離のスコアの合算を見て、そのやり使えるかも?と思えたので、勉強します)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0