LoginSignup
0
0

More than 3 years have passed since last update.

韻を扱いたいpart7(BOW)

Posted at

内容

これまでとはちょっと違ったことをしてみる。テキストの分割方法に頭を悩ましていたが、母音「aiueo」の一致を見るのであれば、母音を様々に並べ、その母音が文章中に出てきたかどうかを示すことで、文章同士を比べられるのでは?という考えのもとやってみる。つまり、「出現頻度を気にせず、各単語が出現したかどうかのみに着目する」バイナリ表現という方法の各単語を母音の様々な並びにする。

様々な母音の並びを単語に見立てたword_listの作成

from pykakasi import kakasi
import re
import numpy as np
import pandas as pd

with open("./gennama.txt","r", encoding="utf-8") as f:
    data = f.read()

vowel_list = ["a","i","u","e","o"]
#単語リスト。母音のみ使ってできる2文字から4文字の単語。775種類
word_list = []
for i in vowel_list:
    for j in vowel_list:
        for k in vowel_list:
            for l in vowel_list:
                    word_list.append(i+j)
                    word_list.append(i+j+k)
                    word_list.append(i+j+k+l)                    

text_data = re.split("\u3000|\n", data)
kakasi = kakasi()
kakasi.setMode('J', 'a')
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
conv = kakasi.getConverter()
vowel_text_list = [conv.do(d) for d in text_data]
vowel_text_list = [re.sub(r"[^aeiou]+","",text) for text in vowel_text_list]

以外にあっさりしたものである。単語の種類も755とそこまで多くない。これまでの経験則で、5文字以上の母音の一致はごく稀であるため、4文字までとした。今までは様々な辞書を作成していたが、DataFrameにまとめてみる。

DataFrame作成

df = pd.DataFrame({"文章": text_data, "母音": vowel_text_list})
#カラム名"aa"等で、文章中に出現したら1、しなければ0
binaly_dic = {}
temp = []
for word in word_list:
    for vowel in vowel_text_list:
        if word in vowel:
            temp.append(1)
        else:
            temp.append(0)
        binaly_dic[word] = temp
    temp = []

for k, v in binaly_dic.items():
    df[k] = v
df.to_csv("df_test.csv")

カラムは「文章、母音、単語…」とし、「文章」には元のテキストデータを分割した文章、「母音」にはそれを母音のみに変換したもの、「単語…」にはその単語が文章中に入っていれば1、入っていなければ0をそれぞれ与えた。

活用例

#コサイン類似度        
def cosine_similarity(v1, v2):
    cos_sim = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
    return cos_sim

print(cosine_similarity(df.iloc[0, 2:].values, df.iloc[3, 2:].values))

例えばこのようにして、文章0と文章3の類似度を表示させる。他にもsumを使って、どの単語が一番共通して使われているか、等もすぐに分かる。

まとめ

母音のみに着目しているので、2~4文字で全ての組み合わせを考えても単語数755に抑えられた。これまで文章を分割して取り扱おうとしていたが、そのままでも出来ることがあった。自分の中で大きな出来事なので、内容が薄いが記事にした。今後は文章の類似度からさらに何か処理をしたり出来ないか等、作ったDataFrameを元にやっていこうと思う。

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