2011-12-02 38 views
13

Cách hiệu quả nhất để thực hiện tìm kiếm ngữ âm trong C++ và/hoặc Java là gì? Bằng cách tìm kiếm ngữ âm, tôi có nghĩa là thay thế các nguyên âm hoặc phụ âm tương tự. Điều này sẽ đặc biệt hữu ích cho tên vì đôi khi tên của người dân có loại cách viết lạ.Cách hiệu quả nhất để thực hiện tìm kiếm ngữ âm

Tôi nghĩ rằng việc thay thế nguyên âm và một số phụ âm có hiệu quả. Nó cũng có thể là tốt để bao gồm một số trường hợp đặc biệt như im lặng E ở cuối hoặc F và PH. Nó sẽ là tốt nhất để sử dụng cstrings hoặc chuỗi trong C + +? Nó sẽ là tốt hơn để lưu trữ một bản sao trong bộ nhớ với các giá trị thay thế hoặc gọi một chức năng mỗi khi chúng ta tìm kiếm một cái gì đó?

Trả lời

13

Soundex cùng với các biến thể của nó là thuật toán chuẩn cho việc này. Nó sử dụng các quy tắc ngữ âm để biến đổi tên thành mã chữ và số. Các tên có cùng mã được nhóm lại với nhau.

Theo như triển khai tìm kiếm, tôi sẽ sử dụng cấu trúc dữ liệu ánh xạ từng mã âm thanh vào danh sách tên có mã đó. Tùy thuộc vào cấu trúc dữ liệu được sử dụng (bảng băm hoặc cây), việc tra cứu có thể được thực hiện đúng lúc hoặc là hằng số trên logarit trong số các mã âm thanh riêng biệt.

Tôi không chắc chắn chính xác ý bạn là gì bởi cstring (của Microsoft CString?) Nhưng lớp tiêu chuẩn std::string sẽ hoàn toàn ổn cho vấn đề này và sẽ là lựa chọn ưa thích của tôi.

+0

bởi 'cstring' Tôi có nghĩa là một mảng kiểu' char'. –

+1

@ user964672: Không có lý do để làm điều đó ở đây - lời khuyên của tôi sẽ được gắn với 'std :: string'. – NPE

19

Bên cạnh Soundex bạn cũng sẽ tìm ra Metaphone hoặc đúp Metaphone thuật toán ngữ âm, mà dường như là một sự cải tiến cho cách phát âm tiếng Anh và là một thuật toán khá mới.

Để phát âm tiếng Đức, tôi sử dụng "Kölner Phonetik".

Apache Commons Codec mang đến cho bạn một rất đơn giản Java thực hiện các thuật toán cơ bản (Soundex, Metaphone, ...) http://commons.apache.org/codec/ Ví dụ thấy javadoc cho Soundex: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/language/Soundex.html

Just bằng cách nhập mã sau đây cho bạn giá trị ngữ âm của Chuỗi của bạn:

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

Và sau đó bạn chỉ cần làm điều đó cho hai và so sánh các giá trị ngữ âm. Hava xem xét các bài sau đây nếu bạn đang so sánh hai chuỗi, vì equals() phương pháp chỉ là đen và trắng, và có thể bạn muốn biết có bao nhiêu% đó là phù hợp với:

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

+0

Bạn có biết thực hiện JAVA của "Kölner Phonetik" – mica

+1

Có - chúng tôi đã sử dụng codec apache commons. Ở đây bạn tìm thấy lớp "ColognePhonetic". 'mới ColognePhonetic(). mã hóa ("Hans")'. Nhưng chúng tôi không còn sử dụng nó cho ngôn ngữ Đức, nó dường như bỏ qua quá nhiều thứ và hầu như tất cả các từ được coi là bình đẳng. – FiveO

+0

cho tiếng Đức Tôi tìm thấy các ngữ âm học Hannover, một phonet4java java thực hiện, cab được tìm thấy ở đây: http://code.google.com/p/phonet4java – mica

Các vấn đề liên quan