Letztes Mal Muss die Methode zum Teilen von Eingabedaten verbessert werden? Ich fühlte das, also versuchte ich verschiedene Teilungsmethoden. Die Eingabedaten verwenden wie zuvor den Text eines bestimmten Wrappers. Zur Zeit habe ich auch ein Thema des Reims, den ich zur Überprüfung aufwärmte.
import MeCab
mecab = MeCab.Tagger("-Owakati")
mecab_text = mecab.parse(data).split()
Es gibt einen Teil, in dem die "Lyrik" als Text extrahiert werden kann, aber sie kann nicht erkannt werden, da der Teil, auf den bei "Zehntausenden Yen" getreten wird, durch die Unterteilung in "Zehntausende Yen" unterteilt wird. Abgesehen davon scheint es, dass Sie nicht viele Daten gleichzeitig an "conv.do" von "kakashi" übergeben können. text_data = [conv.do (Text) für Text in mecab_text]
. Übrigens betrug die maximale Länge des nach der Teilung in Vokale umgewandelten Wortes 8 Zeichen und der Durchschnitt 2,16 Zeichen. Man kann sagen, dass die Division durch Division nicht geeignet ist, weil sie zu fein geteilt ist.
~~ Ich war viele Male frustriert, bevor ich dieses MeCab benutzen konnte. Ich habe möglicherweise verschiedene Artikel übersehen. Hier Danke ~~
Aber was ist, wenn wir es einfach durch N Zeichen teilen? N wird ab 4 versuchen.
def make_ngram(words, N):
ngram = []
for i in range(len(words)-N+1):
#Entfernen Sie Doppelbyte-Leerzeichen und Zeilenumbrüche
row = "".join(words[i:i+N]).replace("\u3000","").replace("\n","")
ngram.append(row)
return ngram
Was die Erfahrung betrifft, scheint N bei 5 oder mehr gut zu sein. (Wenn es 4 oder weniger ist, gibt es keinen Unterschied in der Punktzahl.) Der Reim kann anhand der Texte erkannt werden. Als ich die Verifizierungsdaten als Test einfügte, konnte ich einen scheinbar unbemerkten Reim entdecken. Da Wörter auf verschiedene Arten ausgeschnitten werden, versuchen Sie, die Art und Weise zu ändern, in der sie bewertet werden.
def make_score_ngram(word_a, word_b):
score = 0
for i in range(len(word_a)):
if word_a[-i:] == word_b[-i:]:
score += i
return score
Die Ausgabe ist leicht zu sehen, wenn die Vokalübereinstimmung am Ende des Wortes angezeigt wird. Für den Wert von N wäre len (target_word_vo)
(die Länge des Vokals des ursprünglichen Wortes, um nach dem Reim zu suchen) gut. Ich habe das Gefühl, dass ich ausdrücken konnte, was ich tun möchte.
Es fiel mir schwer, die Verwendung von MeCab zu ermöglichen, und ich dachte darüber nach, den Reim auf meine eigene Weise zu quantifizieren, also möchte ich ihn verwenden. Kombinieren wir diese beiden.
Bei "Quantifizierung des Reims" wurde der Teil gesucht, in dem die Vokale übereinstimmen, und die übereinstimmende Länge "len (Wort [i: j)" wurde als Punktzahl verwendet. Dieses Wort [i: j] hat eine Form wie "eoi". Wenn Sie die Anzahl der Vorkommen zählen, sollten Sie in der Lage sein, den am häufigsten vorkommenden Vokal in den Eingabedaten zu finden. Die Idee ist, dass Sie viele Empfehlungen erwarten können, wenn Sie ein Wort angeben, das es in target_word
enthält. Es tut mir leid, den für die Fraktionierung und Überprüfung vorbereiteten Text zu verwenden.
from pykakasi import kakasi
import re
from collections import defaultdict
import MeCab
with open("./test.txt","r",encoding="utf-8") as f:
data = f.read()
mecab = MeCab.Tagger("-Owakati")
mecab_text = mecab.parse(data).split()
kakasi = kakasi()
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
kakasi.setMode('J', 'a')
conv = kakasi.getConverter()
text_data = [conv.do(text) for text in mecab_text]
vowel_data = [re.sub(r"[^aeiou]+","",text) for text in text_data]
dic_vo = {k:v for k,v in enumerate(vowel_data)}
#voel_Erstellen Sie ein Wörterbuch, damit Sie die Daten vor der Vokalkonvertierung aus dem Datenindex sehen können.
dic = {k:v for k,v in enumerate(mecab_text)}
#Verwenden Sie defaultdict, um die Initialisierung beim Hinzufügen neuer Schlüssel zu überspringen{Vokal:Anzahl der Auftritte}
dic_rhyme = defaultdict(int)
for word_a in vowel_data:
for word_b in vowel_data:
if len(word_a) > len(word_b):
word_len = len(word_b)
for i in range(word_len):
for j in range(word_len + 1):
#Zählen Sie nur 2 oder mehr Zeichen
if word_b[i:j] in word_a and not len(word_b[i:j])<2:
dic_rhyme[word_b[i:j]] += 1
else:
word_len = len(word_a)
for i in range(word_len):
for j in range(word_len + 1):
if word_a[i:j] in word_b and not len(word_a[i:j])<2:
dic_rhyme[word_a[i:j]] += 1
#In absteigender Reihenfolge sortieren
dic_rhyme = sorted(dic_rhyme.items(), key=lambda x:x[1], reverse=True)
print(dic_rhyme)
#dic_Suche nach denen, die einen höheren Reim haben. Hier"ai"verwenden
bool_index = ["ai" in text for text in vowel_data]
for i in range(len(vowel_data)):
if bool_index[i]:
print(dic[i])
Ich konnte die Folge von Vokalen, die häufig erscheinen, abrufen und dort ausgeben, wo sie verwendet werden. Die durch die Unterteilung unterteilten Wörter waren jedoch schwer zu verstehen. Vielleicht gab es einen etwas längeren Reim.
Ich habe nicht das Bedürfnis, das Zielwort einzugrenzen (weil ich angeben möchte, was ich am meisten sagen möchte), aber es kann gut sein, bestätigen zu können, welche Vokalsequenz häufig ist. Es passte nicht gut zur Division, aber ich möchte es durch die Verwendung von MeCab verbessern (~~ viele Male hatte ich Probleme, bis es nutzbar wurde ~~). Durch die Einführung von N-Gramm konnten wir auch die "Quantifizierung des Reims" vereinfachen, sodass wir überlegen werden, ob wir "Rhin" auf etwas kompliziertere Weise neu definieren können. (Derzeit wird "tsu" nicht berücksichtigt.) Ich machte jedoch einen Umweg. "Numerisierung des Reims" ist etwas, über das ich auf meine eigene Weise nachgedacht habe, damit ich mit den Eingabedaten umgehen kann, um den Reim nicht zu verlieren. Auf keinen Fall kann das Schneiden verschiedener Argumente die Eingabedaten lösen, indem sie unterschiedlich geschnitten werden (der Ausdruck kann unterschiedlich sein) ... oder nicht bemerkt werden. Die Grundlagen sind wichtig. Aber glauben Sie nicht, dass N-Gramm bedeutungsloses Japanisch machen kann? Es gibt jedoch eine Möglichkeit, den "lyrischen" Teil hervorzuheben und auszusprechen. Schließlich ist es wichtig, trotzdem einfache Daten zu verwenden.
Recommended Posts