[PYTHON] Ich möchte mit dem Reim part2 umgehen

__ Inhalt __

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.

__ Im Falle einer Teilung __

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 ~~

__N-Gramm __

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.

Ist __target_word nicht eingegrenzt? !! __ __

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.

Verbesserung

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

Ich möchte mit dem Reim Teil1 umgehen
Ich möchte mit dem Reim part3 umgehen
Ich möchte mit dem Reim part2 umgehen
Ich möchte mit dem Reim part5 umgehen
Ich möchte mit dem Reim part4 umgehen
Ich möchte mit dem Reim part7 (BOW) umgehen
Ich möchte mit dem Reim part6 umgehen (einmal organisieren)
Ich möchte mit dem Reim part8 umgehen (einmal fertig)
Ich möchte ssh mit dem Befehl expected automatisieren! Teil 2
Ich möchte Spyder an die Taskleiste anheften
Ich möchte kühl auf die Konsole ausgeben
Ich möchte den Fortschrittsbalken anzeigen
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich möchte die Aktivierungsfunktion Mish verwenden
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte den Dateinamen von DataLoader sehen
Ich möchte das Ausführungsergebnis von strace erfassen
Ich möchte in der Django-Verschiebungstabelle scrollen, aber ...
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich möchte SUDOKU lösen
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich möchte ssh mit dem Befehl expected automatisieren!
Ich möchte das Produkt zu den niedrigsten Kosten veröffentlichen
Ich möchte R-Datensatz mit Python verwenden
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
[TensorFlow] Ich möchte die Indizierung für Ragged Tensor beherrschen
Ich möchte Daten mit Python analysieren können (Teil 3)
Ich möchte das neueste gcc verwenden, auch wenn ich keine Sudo-Berechtigungen habe! !!
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Ich möchte die von LINE an S3 gesendeten Fotos speichern
maya Python Ich möchte die gebackene Animation wieder reparieren.
Ich möchte vorerst Selen bewegen [für Mac]
Ich möchte Daten mit Python analysieren können (Teil 1)
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte mit Numpy die japanische Flagge in die Palau-Flagge ändern
Ich möchte Daten mit Python analysieren können (Teil 4)
Ich möchte die zulässige Ausfallzeit aus der Betriebsrate berechnen
Ich möchte Daten mit Python analysieren können (Teil 2)
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte die Authentizität eines Elements eines numpy-Arrays bestimmen
Ich möchte die Natur von Python und Pip kennenlernen
Ich möchte den Wörterbuchtyp in der Liste eindeutig machen
Ich möchte den EDINET-Code und die Wertpapiernummer zuordnen
Keras Ich möchte die Ausgabe einer beliebigen Ebene erhalten !!
Ich möchte vorerst eine Docker-Datei erstellen.
Ich wollte den AWS-Schlüssel nicht in das Programm schreiben
Ich möchte systemd grob verstehen
Ich habe versucht, das Wahrscheinlichkeitsintegral (I zu Integral) zu berechnen.
Ich möchte Bilder kratzen und trainieren
Ich möchte ○○ mit Pandas machen
Ich möchte Yolos Anmerkung kopieren
Ich möchte mit Python debuggen
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich möchte den Namen der ausgeführten Funktion / Methode erhalten
Ich möchte die Ausführungszeit aufzeichnen und ein Protokoll führen.
[Pytorch] Ich möchte die Trainingsparameter des Modells manuell zuweisen
Ich möchte automatisch hochwertige Teile aus den von mir aufgenommenen Videos finden
Ich möchte das Wetter mit LINE bot feat.Heroku + Python wissen