2012-01-26 42 views

Trả lời

9

Tôi không chắc rằng một regex sẽ là cách tốt nhất để xây dựng một công cụ so sánh mạnh mẽ. Một regex đơn giản có thể là một phần của giải pháp lớn hơn, sử dụng các thuật toán phức tạp hơn cho kết hợp không chính xác.

Có nhiều tùy chọn sẵn có cho tiếng Anh, một số trong đó có thể được mở rộng khá đơn giản bằng các ngôn ngữ sử dụng số Latin alphabet. Hầu hết các thuật toán này đã tồn tại trong nhiều năm hoặc thậm chí nhiều thập kỷ và được ghi chép đầy đủ, mặc dù tất cả chúng đều có giới hạn.

Tôi tưởng tượng rằng có các thuật toán tương tự cho bảng chữ cái không phải là chữ cái Latinh nhưng tôi không thể nhận xét trực tiếp về tính khả dụng của chúng.

phiên âm thuật toán

Thuật toán Soundex là gần 100 tuổi và đã được thực hiện bằng nhiều ngôn ngữ lập trình. Nó được sử dụng để xác định một giá trị số dựa trên cách phát âm của một chuỗi. Nó không chính xác nhưng nó có thể hữu ích cho việc xác định các từ/âm tiết tương tự. Tôi đã thử nghiệm với nó trong MS SQL Server và nó có sẵn trong PHP.

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

sự đồng thuận chung (bao gồm cả các tài liệu PHP) là Metaphone là chính xác hơn nhiều so với Soundex khi giao dịch với ngôn ngữ tiếng Anh. Có rất nhiều triển khai có sẵn (Wikipedia có một danh sách dài ở cuối bài viết) và nó được bao gồm trong PHP.

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

đúp Metahpone hỗ trợ mã hóa thứ hai của một từ tương ứng với một phát âm khác của từ này.

Như với Metaphone, Double Metaphone đã được triển khai bằng nhiều ngôn ngữ lập trình (example).

Lời Deconstruction

Levenshtein có thể được sử dụng để đề nghị phát âm khác (ví dụ, để bình thường hóa đầu vào người sử dụng) và có thể có ích như một phần của một thuật toán cụ thể hơn cho điệp âm và vận nghèo.

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

Một cách logic, nó sẽ giúp để hiểu được âm tiết của các từ trong chuỗi sao cho mỗi từ có thể được deconstructed. Việc phá vỡ âm tiết có thể giải quyết sự mơ hồ như thế nào để phát âm hai chữ liền kề. Bài nầy có một vài liên kết:

PHP Syllable Detection

+0

wow, cảm ơn vì đã xem tổng quan về chủ đề này! – Francesco

+2

+1 Câu trả lời hay! Là một lập trình viên có trình độ tiếng Anh, tôi siêu được đào tạo để đào sâu vào các liên kết của bạn! – rdlowrey

1

Để tìm alliterations trong một văn bản bạn chỉ cần lặp qua tất cả các từ, bỏ qua những lời quá ngắn và quá phổ biến, và thu thập chúng càng lâu càng trận chữ ban đầu của họ.

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] 
    } 
}) 

Kết quả:

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

Đối với phân tích tiên tiến hơn và cũng để tìm assonances và vần đầu tiên bạn phải dịch một văn bản vào chính tả ngữ âm. Bạn không nói ngôn ngữ nào bạn đang nhắm mục tiêu, bằng tiếng Anh có một số từ điển ngữ âm có sẵn trực tuyến, ví dụ: từ Carnegie Mellon: ftp://ftp.cs.cmu.edu/project/fgdata/dict