2012-01-26 10 views

Odpowiedz

9

nie jestem pewien, że regex byłby najlepszy sposób budowania solidnego narzędzia do porównania. Proste wyrażenie regularne może być częścią większego rozwiązania, które używało bardziej wyrafinowanych algorytmów do niedokładnego dopasowywania.

Istnieje wiele łatwo dostępnych opcji w języku angielskim, z których niektóre mogą być rozszerzone dość po prostu na języki, które używają Latin alphabet. Większość z tych algorytmów istnieje od lat lub nawet dziesięcioleci i jest dobrze udokumentowana, choć wszystkie mają ograniczenia.

Wyobrażam sobie, że istnieją podobne algorytmy dla alfabetów innych niż łacińskie, ale nie mogę skomentować ich dostępności z pierwszej ręki.

Algorytmy fonetyczne

Algorytm Soundex jest prawie 100 lat i został wdrożony w wielu językach programowania. Służy do określania wartości numerycznej na podstawie wymowy napisu. Nie jest precyzyjny, ale może być przydatny do identyfikowania podobnych brzmiących słów/sylab. Eksperymentowałem z nim na MS SQL Server i jest on dostępny w PHP.

http://php.net/manual/en/function.soundex.php

Ogólny konsensus (w tym docs PHP) jest to, że Metaphone jest znacznie dokładniejsza niż Soundex gdy ma do czynienia z językiem angielskim. Istnieje wiele dostępnych implementacji (Wikipedia ma długą listę na końcu artykułu) i jest zawarta w PHP.

http://www.php.net/manual/en/function.metaphone.php

dwukrotnie Metahpone obsługuje drugie kodowanie słowem odpowiadającym alternatywnym wymowie tego słowa.

Podobnie jak w przypadku Metaphone, Double Metaphone został zaimplementowany w wielu językach programowania (example).

Słowo dekonstrukcjonizm

Levenshteina można także stosować do sugerowania innej pisowni (na przykład w celu normalizacji danych wprowadzonych przez użytkownika) i może być przydatny w ramach bardziej szczegółowego algorytmu aliteracji i assonance.

http://www.php.net/manual/en/function.levenshtein.php

Logicznie, że to pomoże zrozumieć sylabiczność słów w ciąg tak, że każde słowo może być rozebrany. Sylaba może rozwiązać niejednoznaczność, jak powinny być wymawiane dwie sąsiednie litery. Ten wątek ma kilka linków:

PHP Syllable Detection

+0

wow, dziękuję za kompletny przegląd na ten temat! – Francesco

+2

+1 Dobra odpowiedź! Jako programista z angielskim stopniem jestem super wpompowany w twoje linki! – rdlowrey

1

Aby znaleźć aliteracje w tekście po prostu iteracyjne nad wszystkie słowa, pomijając zbyt krótki i zbyt często używane słowa i zebrać je tak długo, jak ich początkowe litery meczu.

text = '' 
+'\nAs I looked to the east right into the sun,' 
+'\nI saw a tower on a toft worthily built;' 
+'\nA deep dale beneath a dungeon therein,' 
+'\nWith deep ditches and dark and dreadful of sight' 
+'\nA fair field full of folk found I in between,' 
+'\nOf all manner of men the rich and the poor,' 
+'\nWorking and wandering as the world asketh.' 

skipWords = ['the', 'and'] 
curr = [] 

text.toLowerCase().replace(/\b\w{3,}\b/g, function(word) { 
    if (skipWords.indexOf(word) >= 0) 
     return; 
    var len = curr.length 
    if (!len || curr[len - 1].charAt(0) == word.charAt(0)) 
     curr.push(word) 
    else { 
     if (len > 2) 
      console.log(curr) 
     curr = [word] 
    } 
}) 

Wyniki:

["deep", "ditches", "dark", "dreadful"] 
["fair", "field", "full", "folk", "found"] 
["working", "wandering", "world"] 

Dla bardziej zaawansowanych parsowania a także znaleźć asonans i rymy najpierw trzeba przetłumaczyć tekst na fonetycznej pisowni. Nie znasz języka, na który kierujesz reklamy, ponieważ w języku angielskim dostępne są online słowników fonetycznych, na przykład z Carnegie Mellon: ftp://ftp.cs.cmu.edu/project/fgdata/dict