##内容
これまでとはちょっと違ったことをしてみる。テキストの分割方法に頭を悩ましていたが、母音「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を元にやっていこうと思う。