2011-12-02 18 views
13

Jaki jest najskuteczniejszy sposób wdrożenia wyszukiwania fonetycznego w C++ i/lub Java? Przez wyszukiwanie fonetyczne rozumiem zastępowanie samogłosek lub spółgłosek, które brzmią podobnie. Byłoby to szczególnie przydatne w przypadku nazw, ponieważ czasami nazwiska ludzi mają dziwne pisownię.Najbardziej efektywny sposób na wykonanie wyszukiwania fonetycznego

Myślę, że może zastąpić samogłoski i niektóre spółgłoski. Dobrym rozwiązaniem może być także specjalne przypadki, takie jak ciche E na końcu lub F i PH. Czy najlepiej byłoby użyć cstrings lub stringów w C++? Czy lepiej byłoby przechowywać kopię w pamięci z podstawionymi wartościami lub wywoływać funkcję za każdym razem, gdy czegoś szukamy?

Odpowiedz

13

Soundex wraz ze swoimi wariantami jest standardowym algorytmem do tego. Używa reguł fonetycznych do przekształcenia nazwy w kod alfanumeryczny. Nazwy z tym samym kodem są zgrupowane razem.

Jeśli chodzi o wdrażanie wyszukiwania, użyłbym struktury danych, która mapuje każdy kod soundex na listę nazw, które mają ten kod. W zależności od stosowanej struktury danych (tablica hash lub drzewo), wyszukiwanie może być wykonywane w czasie, który jest stały lub logarytmiczny w liczbie różnych kodów dźwiękowych.

Nie jestem pewien, co dokładnie masz na myśli przez cstring (Microsoft's CString?), Ale standardowa klasa std::string będzie doskonale pasować do tego problemu i byłaby moim preferowanym wyborem.

+0

przez 'cstring' Mam na myśli tablicę typu' char'. –

+1

@ user964672: Nie ma powodu, aby to robić tutaj - moja rada to trzymać się 'std :: string'. – NPE

19

Poza Soundex znajdziesz również Metaphone lub Pokój Metaphone fonetyczne algorytm, który wydaje się być poprawa w wymowie angielskiej i jest całkiem nowy algorytm.

W przypadku niemieckiej wymowy używam "Kölner Phonetik".

Apache Commons Codec daje bardzo prosty Java realizacji tych podstawowych algorytmów (Soundex, Metaphone, ...) http://commons.apache.org/codec/ przykładowo patrz Javadoc dla soundex: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/language/Soundex.html

Wystarczy wpisując poniższy kod, wartość fonetyczna Twojego ciągu:

Soundex soundex = new Soundex(); 
String phoneticValue = soundex.encode("YourString"); 

A potem możesz zrobić to po prostu dla dwóch osób ciągi i porównać wartości fonetyczne. Hava spojrzenie na poniższym poście jeśli porównanie dwóch ciągów, ponieważ equals() metody jest tylko czarno-białe, a może chcesz wiedzieć, ile% jest dopasowanie:

How to compare almost similar Strings in Java? (String distance measure)

+0

Czy znasz implementację JAVA programu "Kölner Phonetik" – mica

+1

Tak - użyliśmy kodeka apache commons. Tutaj znajdziesz klasę "ColognePhonetic". "new ColognePhonetic(). encode (" Hans ")". Ale już nie używamy go dla języka niemieckiego, wydawało się, że ignoruje się zbyt wiele rzeczy i prawie wszystkie słowa zostały uznane za równe. – FiveO

+0

dla języka niemieckiego Znalazłem Hannover-phonetics, implementację java phonet4java, taksówkę można znaleźć tutaj: http://code.google.com/p/phonet4java – mica

Powiązane problemy