2014-09-07 13 views
12

Ich habe ein Gedicht und ich möchte den Python-Code nur die Wörter, die sich reimen miteinander drucken.Finden Sie Reim mit NLTK in Python

So weit ich bin in der Lage zu:

  1. die wordpunct_tokenize()
  2. Reinigen Sie die Wörter, indem die Satzzeichen
  3. Shop das letzte Wort jedes Satzes des Gedichts in einer Liste mit Gedicht Sätze brechen
  4. Generieren Sie eine andere Liste mit cmudict.entries() mit Elementen wie diese letzten Wörter und ihre Aussprache.

Ich bin mit dem nächsten Schritt fest. Wie sollte ich versuchen, diese Aussprachen zu erreichen? Insgesamt besteht meine Hauptaufgabe darin, herauszufinden, ob sich zwei gegebene Wörter reimen oder nicht. Wenn Reim, dann zurück True, sonst False.

+0

So wird Ihre Frage, wie Reim, wenn zwei Worte zu finden, nltk mit? – kender

+0

Ja. Die Wörter könnten in einer Textfolge vorkommen – learner57

+3

Ich denke nicht, dass die Frage überhaupt sinnlos ist. Die Verfahrensidentifikation des Reims könnte viele mögliche Forschungsanwendungen haben ... – duhaime

Antwort

7

Here fand ich einen Weg, Reime zu einem gegebenen Wort finden NLTK mit:

def rhyme(inp, level): 
    entries = nltk.corpus.cmudict.entries() 
    syllables = [(word, syl) for word, syl in entries if word == inp] 
    rhymes = [] 
    for (word, syllable) in syllables: 
      rhymes += [word for word, pron in entries if pron[-level:] == syllable[-level:]] 
    return set(rhymes) 

wo imp ein Wort ist und level bedeutet, wie gut der Reim sein sollte.

So könnte man diese Funktion verwenden und zu prüfen, ob zwei Wörter reimen können Sie einfach überprüfen, ob man in anderen Satz von erlaubten Reime ist:

def doTheyRhyme (word1, word2): 
    # first, we don't want to report 'glue' and 'unglue' as rhyming words 
    # those kind of rhymes are LAME 
    if word1.find (word2) == len(word1) - len (word2): 
     return False 
    if word2.find (word1) == len (word2) - len (word1): 
     return False 

    return word1 in rhyme (word2, 1) 
+0

funktioniert es für den perfekten Reim! aber ich bekomme den Level-Parameter nicht. Ich habe einen nicht perfekten Reim, z.B. "gelegt" und "lay" und eine große Zahl für "level", aber es gibt kein True zurück. – adrianX

3

Verwenden Sie Soundex oder Doppel-Metaphone, um herauszufinden, ob sie sich reimen. NLTK scheint diese nicht zu implementieren, aber eine schnelle Google-Suche zeigte einige Implementierungen.

+1

so heiß und hat Reim? Denn dies ist ein häufiger Fehlalarm bei der Verwendung von Metaphon. Ich glaube nicht, dass diese Bibliotheken verwendet werden, um Wörter zu finden, die sich reimen. – RetroCode