2014-10-20 12 views
8

Ich arbeite an der Erkennung von Reimen in Python mit dem Carnegie Mellon University Aussprachewörterbuch und würde gerne wissen: Wie kann ich die phonemische Ähnlichkeit zwischen zwei Wörtern schätzen? Mit anderen Worten, gibt es einen Algorithmus, der die Tatsache erkennen kann, dass "Hände" und "Pläne" dem Reimen näher sind als "Hände" und "Pommes"?Schätzung der phonemischen Ähnlichkeit zwischen zwei Wörtern

Einige Kontext: Zuerst war ich bereit zu sagen, dass zwei Wörter reimen, wenn ihre primäre Silbe betont und alle nachfolgenden Silben sind identisch (c06d wenn Sie wollen in Python replizieren):

def create_cmu_sound_dict(): 

    final_sound_dict = {} 

    with open('resources/c06d/c06d') as cmu_dict: 
     cmu_dict = cmu_dict.read().split("\n") 
     for i in cmu_dict: 
      i_s = i.split() 
      if len(i_s) > 1: 
       word = i_s[0] 
       syllables = i_s[1:] 

       final_sound = "" 
       final_sound_switch = 0 

       for j in syllables: 
        if "1" in j: 
         final_sound_switch = 1 
         final_sound += j 
        elif final_sound_switch == 1: 
         final_sound += j 

      final_sound_dict[word.lower()] = final_sound 

    return final_sound_dict 

Wenn ich dann

print cmu_final_sound_dict["hands"] 
print cmu_final_sound_dict["plans"] 

laufen kann ich sehen, dass Hände und Pläne sehr ähnlich klingen. Ich könnte selbst auf eine Einschätzung dieser Ähnlichkeit hinarbeiten, aber ich dachte, ich sollte fragen: Gibt es ausgeklügelte Algorithmen, die einen mathematischen Wert mit diesem Grad an klanglicher (oder auditiver) Ähnlichkeit verbinden können? Das heißt, welche Algorithmen oder Pakete kann man verwenden, um den Grad der phonemischen Ähnlichkeit zwischen zwei Wörtern zu mathematisieren? Ich weiß, dass dies eine große Frage ist, aber ich wäre sehr dankbar für jeden Rat, den andere zu dieser Frage anbieten können.

+0

Warum abstimmen und zum Schließen bewegen? Was kann ich tun, um die Frage zu verbessern? – duhaime

+2

Suchen Sie nach etwas wie dem Soundex-Algorithmus (http://en.wikipedia.org/wiki/Soundex)? – acfrancis

+0

Ich kann nicht für den Downvoter sprechen, aber der Grund für die enge Abstimmung ist, dass Ihre Frage so aussieht, als würde sie nach Empfehlungen fragen (http://meta.stackoverflow.com/questions/254393/what-exactly-is) -eine-Empfehlung-Frage). Sie können es anders formulieren, um klarer zu fragen "* Wie kann ich X? *" Anstatt "* Welches Werkzeug soll ich X benutzen? *" –

Antwort

3

Cheat.

#!/usr/bin/env python 

from Levenshtein import * 

if __name__ == '__main__': 
    s1 = ['HH AE1 N D Z', 'P L AE1 N Z'] 
    s2 = ['HH AE1 N D Z', 'F R AY1 Z'] 
    s1nospaces = map(lambda x: x.replace(' ', ''), s1) 
    s2nospaces = map(lambda x: x.replace(' ', ''), s2) 
    for seq in [s1, s2, s1nospaces, s2nospaces]: 
     print seq, distance(*seq) 

Ausgang:

['HH AE1 N D Z', 'P L AE1 N Z'] 5 
['HH AE1 N D Z', 'F R AY1 Z'] 8 
['HHAE1NDZ', 'PLAE1NZ'] 3 
['HHAE1NDZ', 'FRAY1Z'] 5 

Library: https://pypi.python.org/pypi/python-Levenshtein/0.11.2

Im Ernst, aber da Sie nur Text als Eingabe haben und so ziemlich die textbasierte CMU dict sind Sie auf einige beschränkt Art der Manipulation der Texteingabe; aber so wie ich es sehe, gibt es nur eine begrenzte Anzahl von Phonems, also könntest du die wichtigsten nehmen und ihnen "phonemische Gewichte" zuweisen. Es gibt nur 74 von ihnen in der CMU Wörterbuch Sie zeigte:

% cat cmudict.06.txt | grep -v '#' | cut -f 2- -d ' ' | tr ' ' '\n' | sort | uniq | wc -l 
75 

(75 minus eins für leere Zeile)

Sie wahrscheinlich bessere Ergebnisse erhalten würden, wenn Sie haben in Schritt 2 smth fortgeschritteneren getan : Weisen Sie bestimmten Phonem-Kombinationen Gewichte zu. Dann könnten Sie einige Levenshtein-Distanzmaße modifizieren, z. in der obigen Bibliothek, um eine vernünftige "phonemische Distanz" -Methode zu entwickeln, die an Texteingaben arbeitet.

Nicht viel Arbeit für Schritt 3: Profit.

+0

Dies ignoriert vollständig die phonemischen Merkmale, wodurch "nd" dazu neigt, sich in Richtung "n" zu assimilieren, wohingegen z. "nk" tendiert nicht (oder tendiert zu "ngk" oder wird tatsächlich regelmäßig als "ngk" umgesetzt). – tripleee

0

1) erhalten alle TTS-Audio für alle Wörter durch Web-API oder die lokale SAPI,

2) Sprachmerkmale extrahieren, wenn Sie können (1, 2) oder zumindest die Kraft der

Daten Sprache erhalten

3) Abhängig von der Funktion, die Sie haben, hier sind einige Ansätze.

Wenn Sie die Leistung jedes Samples (Frames) von Sprachdaten (Dim = 1) erhalten können, ist ein einfacher Weg, um die correlation von zwei Satz von Funktionen zu berechnen.

Wenn Sie eine andere Art von Funktionen haben, die höchstwahrscheinlich mehr Dimensionen haben, können Sie es als Bild behandeln und die 2d convolution überprüfen oder Dynamic time warping

4) Wenn Sie keine Kenntnisse über Sprachverarbeitung für die Aufgabe haben 1,2,3, auschecken pyphonetics

#pip install pyphonetics 
>>> from pyphonetics import RefinedSoundex 
>>> rs = RefinedSoundex() 
>>> rs.distance('Rupert', 'Robert') 
0 
>>> rs.distance('assign', 'assist', metric='hamming') 
2 
Verwandte Themen