2014-10-20 8 views
8

Pracuję nad wykrywaniem rymów w Pythonie za pomocą słownika wymowy Carnegie Mellon University i chciałbym wiedzieć: Jak mogę oszacować podobieństwo fonetyczne między dwoma słowami? Innymi słowy, czy istnieje algorytm, który może zidentyfikować fakt, że "ręce" i "plany" są bliższe rymowaniom niż "ręce" i "frytki"?Oszacowanie fonemów podobieństwa między dwoma słowami

Niektóre kontekst: Na początku byłem skłonny powiedzieć, że dwa słowa rymować jeśli ich głównym podkreślił, sylaby i wszystkie kolejne sylaby są identyczne (c06d jeśli chcesz replikować w Pythonie):

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 

Gdybym następnie uruchomić

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

widzę, że ręce i plany brzmią bardzo podobne. Mógłbym pracować nad oszacowaniem tego podobieństwa na własną rękę, ale pomyślałem, że powinienem zapytać: Czy istnieją wyrafinowane algorytmy, które mogą powiązać wartość matematyczną z takim stopniem podobieństwa dźwięku (lub dźwięku)? To jest, jakie algorytmy lub pakiety można użyć do z matemalizowania stopnia podobieństwa fonologicznego między dwoma słowami? Zdaję sobie sprawę, że jest to duże pytanie, ale byłbym wdzięczny za rady, które inni mogą zaoferować w tej sprawie.

+0

Dlaczego dół głos i przenieść się zamknąć? Co mogę zrobić, aby poprawić pytanie? – duhaime

+2

Szukasz czegoś takiego jak algorytm Soundex (http://en.wikipedia.org/wiki/Soundex)? – acfrancis

+0

Nie mogę mówić za downwizera, ale powód podany przy zamykaniu głosowania jest taki, że twoje pytanie wygląda tak, jakby to było [z prośbą o rekomendacje] (http://meta.stackoverflow.com/questions/254393/what-exactly-is -a-zalecenie-pytanie). Możesz go przeformułować, aby wyraźniej zapytać: "Jak mogę zrobić X? *", A nie "* Z jakiego narzędzia powinienem korzystać X? *" –

Odpowiedz

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) 

wyjściowa:

['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 

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

Poważnie jednak, ponieważ masz tylko tekst na wejściu i dość dużo tekstowych CMU dict, jesteś ograniczony do niektórych rodzaj manipulacji wprowadzaniem tekstu; ale tak jak ja to widzę, dostępna jest tylko ograniczona liczba fonemów, więc możesz wziąć te najważniejsze i przypisać im "wagi fonemiczne". Jest tylko 74 z nich w słowniku CMU pan wskazał:

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

(75 minus jeden pustych linii)

Ty pewnie uzyskać lepsze rezultaty, jeśli zrobiłeś smth bardziej zaawansowane w kroku 2 : przypisuj wagi poszczególnym kombinacjom fonemów. Następnie można zmodyfikować niektóre dane odległości typu Levenshtein, np. w powyższej bibliotece, aby wymyślić rozsądnie działającą metrykę "odległości fonemicznej" pracującą na wejściach tekstowych.

Za mało pracy dla etapu 3: zysk.

+0

To całkowicie ignoruje cechy fonemiczne, które powodują, że "nd" asymiluje się w kierunku "n", podczas gdy np. "nk" nie (lub dąży do "ngk", lub w rzeczywistości jest regularnie realizowane jako "ngk"). – tripleee

0

1) uzyskać wszystkie TTS audio dla wszystkich słów poprzez web API lub lokalnej SAPI,

2) Wyciąg funkcji mowy, jeśli można (1, 2), lub przynajmniej uzyskać moc danych mowy

3) W zależności od funkcji, którą masz, oto kilka podejść.

Jeśli możesz uzyskać moc każdej próbki (ramki) danych mowy (Dim = 1), jednym prostym sposobem jest niewątpliwie obliczyć correlation dwóch zestawów funkcji.

Jeśli masz inny typ funkcji, które najprawdopodobniej będą miały więcej wymiarów, można traktować go jako obraz i sprawdzeniu 2d convolution lub Dynamic time warping

4) Jeżeli nie masz wiedzy na temat przetwarzania mowy dla zadania 1,2,3, sprawdź pyphonetics

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