2014-09-07 12 views
12

Mam wiersz i chcę kod Python, aby wydrukować te słowa, które rymują się ze sobą.Znajdź rymowanie za pomocą NLTK w Pythonie

tej pory jestem w stanie:

  1. Break zdań poemat pomocą wordpunct_tokenize()
  2. Czyste słowa usuwając znaki interpunkcyjne
  3. przechowywać ostatnie słowo każdym zdaniu wiersza na liście
  4. Wygeneruj kolejną listę używając cmudict.entries() z elementami takimi jak te ostatnie słowa i ich wymowa.

Utknąłem z następnym krokiem. Jak powinienem starać się dopasować te wymowy? W sumie moim głównym zadaniem jest dowiedzieć się, czy dwa podane słowa rymują się czy nie. Jeśli wierszyk, a następnie powrócić True, inaczej False.

+0

Więc pytanie brzmi, jak znaleźć, jeśli 2 słowa rymować, używając NLTK? – kender

+0

Tak. Słowa mogą pochodzić z ciągu tekstowego – learner57

+3

Nie sądzę, że pytanie w ogóle nie ma sensu. Identyfikacja proceduralna rymowanki może mieć wiele potencjalnych zastosowań badawczych ... – duhaime

Odpowiedz

7

Here znalazłem sposób, aby znaleźć rymy do danego słowa używając NLTK:

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) 

gdzie imp to słowo i level czyli jak dobry wierszyk powinno być.

Więc można użyć tej funkcji i sprawdzić, czy 2 słowa rymować można po prostu sprawdzić, czy ktoś jest w innych ustaw dozwolonych rymów:

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

to działa na idealny rym! ale nie dostaję parametru poziomu. próbowałem jakiejś nieidealnej rymowanki, np. "laid" i "lay" oraz duża liczba dla "level", ale nie zwraca True. – adrianX

3

Użyj soundexu lub podwójnego metafonu, aby dowiedzieć się, czy są to wierszyki. Wydaje się, że NLTK nie implementuje ich, ale szybkie wyszukiwanie Google pokazało pewne implementacje.

+1

, tak rymowanka na gorąco i na kapelusz? Ponieważ jest to bardzo częsty fałszywy alarm podczas używania metafonu. Nie sądzę, że te biblioteki są używane do znajdowania słów, które rymują. – RetroCode

Powiązane problemy