Versuchen wir die vorherige Korrektur, Verwendung und Zählung. Da es in dem Teil, in dem die Vokalfolge als Wort betrachtet wurde, eine Duplizierung gab, korrigieren Sie diese so, dass keine Duplizierung erfolgt. Danach werde ich, wie beim letzten Mal, die Sätze im Text in binären Ausdrücken ausdrücken und diejenigen mit hoher Kosinusähnlichkeit anzeigen. Machen wir dasselbe für den Zählausdruck.
from pykakasi import kakasi
import re
import numpy as np
import pandas as pd
import itertools
with open("./test.txt","r", encoding="utf-8") as f:
data = f.read()
#Wortliste. Ein 2- bis 4-stelliges Wort, das nur mit Vokalen erstellt werden kann. 775 Typen
word_list2 = [i[0]+i[1] for i in itertools.product("aiueo", repeat=2)]
word_list3 = [i[0]+i[1]+i[2] for i in itertools.product("aiueo", repeat=3)]
word_list4 = [i[0]+i[1]+i[2]+i[3] for i in itertools.product("aiueo", repeat=4)]
word_list = word_list2 + word_list3 + word_list4
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]
Ich habe "itertools" verwendet, um das Duplizieren des Wortlistenteils zu verhindern. Es wurde auch verwendet, um zu vermeiden, dass (0,1) und (1,0) zweimal berechnet werden, wenn die Kosinusähnlichkeit der Verwendung untersucht wird. itertools
df = pd.DataFrame({"Satz": text_data, "Vokal": vowel_text_list})
#Spaltenname"aa"Wenn es im Text erscheint, ist es 1, andernfalls ist es 0.
binali_dic = {}
temp = []
for word in word_list:
for vowel in vowel_text_list:
if word in vowel:
temp.append(1)
else:
temp.append(0)
binali_dic[word] = temp
temp = []
for k, v in binali_dic.items():
df[k] = v
Die dritte und die folgenden Spalten geben an, ob der Satz eine Folge von Vokalen enthält, die mit einem Wort wie "aa" verglichen wird.
#Kosinusähnlichkeit
def cosine_similarity(v1, v2):
cos_sim = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
return cos_sim
#Übergeben Sie den Index von df und geben Sie den gemeinsamen Vokal zurück
def common_vowel(index1, index2):
idx = df.iloc[index1, 2:].values + df.iloc[index2, 2:].values
vowel_word = df.columns[2:]
common_list = [vowel_word[i] for i in range(len(idx)) if idx[i] == 2]
return common_list
#Cosinus-Ähnlichkeitsranking. aufführen(Index,Index,cos_sim,Gemeinsame Vokalliste)
def cos_sim_ranking(df, threshold):
ranking = []
idx = itertools.combinations(df.index, 2)
for i in idx:
cos_sim = cosine_similarity(df.iloc[i[0]][2:].values, df.iloc[i[1]][2:].values)
if cos_sim > threshold:
com_list = common_vowel(i[0], i[1])
ranking.append((i[0],i[1],cos_sim,com_list))
return sorted(ranking, key=lambda x:-x[2])
ranking = cos_sim_ranking(df, 0.4)
for r in ranking:
print(df["Satz"][r[0]] + ":" + df["Satz"][r[1]])
print("Gemeinsamer Vokal:{}".format(r[3]))
print()
Für Elemente oberhalb der Kosinus-Ähnlichkeitsschwelle (beliebiger Wert) werden der ursprüngliche Satz und die Folge gemeinsamer Vokale in absteigender Reihenfolge der Ähnlichkeit ausgegeben. Der Reim kann hervorgehoben werden, indem der gemeinsame Vokal am Anfang oder Ende des Satzes unter Verwendung der Inversionsmethode des ursprünglichen Satzes verschoben wird.
df = pd.DataFrame({"Satz": text_data, "Vokal": vowel_text_list})
#Spaltenname"aa"Der Wert ist die Anzahl der Vorkommen
count_dic = {}
temp = []
for word in word_list:
for vowel in vowel_text_list:
temp.append(vowel.count(word))
count_dic[word] = temp
temp = []
for k, v in count_dic.items():
df[k] = v
#Übergeben Sie den Index von df und geben Sie den gemeinsamen Vokal und die Anzahl der Vorkommen zurück
def common_vowel(index1, index2):
idx = df.iloc[index1, 2:].values + df.iloc[index2, 2:].values
vowel_word = df.columns[2:]
common_list = [(vowel_word[i], idx[i]) for i in range(len(idx)) if idx[i] >= 2]
return common_list
Der Unterschied zwischen dem Erstellen eines Datenrahmens und dem Hinzufügen und Zurückgeben der "Anzahl der Vorkommen" in common_vowel. Die Ausgabeergebnisse sind unterschiedlich, selbst wenn derselbe Schwellenwert verwendet wird, und ich fand, dass der Zählausdruck, der die Anzahl der Vorkommen anzeigt, gut ist.
Die Ausgabe der Testdaten war recht zufriedenstellend. Ein gewöhnlicher Vokal ist ein Vokal mit einer Anzahl von 2 oder mehr, aber es gibt einige, die eine Anzahl von 2 in einem Satz haben. Dies zeigte, dass der Text selbst gereimt werden konnte und es eine unerwartete Ernte war. Zuerst habe ich versucht, so lange wie möglich damit umzugehen, aber ich erinnere mich, dass ich aufgegeben habe zu denken, dass ich den "Ton, auf den der Satz selbst treten kann" nicht erfassen konnte. Danach machte ich mir Sorgen darüber, wie ich es teilen sollte, und es war interessant, dass ich Sätze behandelte, ohne sie zu teilen. Nun, es ist nicht so, dass das, was ich bisher getan habe, nicht schlecht ist, und ich bin froh, dass ich die Vor- und Nachteile erkannt habe. Es mag kleinere Korrekturen und Verbesserungen geben, aber ich fand es interessant, wie man den Text durch "welche Art von Vokalsequenz" ausdrückt, so dass "Ich möchte mit dem Reim umgehen" einmal endet.
Ich möchte diesen Zählausdruck mit den Texten des eigentlichen Rapper ausprobieren und sehen, ob es eine Entdeckung gibt.