Essayez quelque chose d'un peu différent qu'avant. Je m'inquiétais de savoir comment diviser le texte, mais si vous voyez la correspondance de la voyelle "aiueo", vous pouvez comparer les phrases en arrangeant les voyelles de différentes manières et en montrant si la voyelle apparaît dans la phrase. N'est-ce pas? Je vais l'essayer sur la base de l'idée. En d'autres termes, chaque mot de la méthode d'expression binaire, qui "ne se soucie pas de la fréquence d'apparition et ne fait attention qu'à savoir si chaque mot apparaît ou non", est organisé en différentes voyelles.
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"]
#Liste de mots. Un mot de 2 à 4 caractères qui peut être créé en utilisant uniquement des voyelles. 775 types
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]
A part ça, c'est simple. Il n'y a pas tellement de types de mots, 755. En règle générale, la correspondance de voyelles de 5 caractères ou plus est extrêmement rare, nous l'avons donc limitée à 4 caractères. Jusqu'à présent, j'ai créé divers dictionnaires, mais je vais les résumer dans DataFrame.
df = pd.DataFrame({"Phrase": text_data, "voyelle": vowel_text_list})
#Nom de colonne"aa"S'il apparaît dans le texte, ce sera 1, sinon ce sera 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")
Les colonnes sont "phrases, voyelles, mots ...", "phrases" sont des phrases dans lesquelles les données textuelles originales sont divisées, "voyelles" sont celles converties en voyelles uniquement et "mots ..." sont des phrases. S'il était à l'intérieur, il a reçu 1, et s'il n'était pas à l'intérieur, il a reçu 0.
#Similitude cosinus
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))
Par exemple, de cette manière, la similitude entre la phrase 0 et la phrase 3 est affichée. Vous pouvez également utiliser sum
pour trouver rapidement les mots les plus couramment utilisés.
Comme je me suis concentré uniquement sur les voyelles, le nombre de mots était limité à 755 même en considérant toutes les combinaisons de 2 à 4 caractères. Jusqu'à présent, j'avais essayé de diviser le texte et de le gérer, mais je pouvais faire certaines choses telles qu'elles étaient. C'est un grand événement pour moi, alors j'ai écrit un article bien que le contenu soit mince. À l'avenir, je ferai quelque chose basé sur le DataFrame créé, par exemple si je peux faire quelque chose de plus éloigné de la similitude des phrases.
Recommended Posts