Sự giống nhau giữa hai từ


14

Tôi đang tìm một thư viện Python giúp tôi xác định sự giống nhau giữa hai từ hoặc câu.

Tôi sẽ thực hiện chuyển đổi Âm thanh thành Văn bản dẫn đến từ điển tiếng Anh hoặc từ không phải từ điển (Đây có thể là tên Người hoặc Công ty) Sau đó, tôi cần so sánh nó với một từ hoặc từ đã biết.

Thí dụ:

1) Kết quả chuyển văn bản thành âm thanh: Cảm ơn bạn đã gọi America Expansion sẽ được so sánh với American Express .

Cả hai câu đều giống nhau nhưng không giống nhau.

Có vẻ như tôi có thể cần xem xét họ chia sẻ bao nhiêu ký tự. Bất kỳ ý tưởng sẽ là tuyệt vời. Có vẻ như một chức năng như tìm kiếm Google "ý bạn là".

Câu trả lời:


13

Gần nhất sẽ giống như Jan đã đề cập đến câu trả lời của inhis, khoảng cách của Levenstein (còn được gọi phổ biến là khoảng cách chỉnh sửa).

Trong lý thuyết thông tin và khoa học máy tính, khoảng cách Levenshtein là một thước đo chuỗi để đo sự khác biệt giữa hai chuỗi. Một cách không chính thức, khoảng cách Levenshtein giữa hai từ là số lần chỉnh sửa một ký tự tối thiểu (nghĩa là chèn, xóa hoặc thay thế) cần thiết để thay đổi một từ thành từ khác.

Nó là một số liệu được sử dụng rất phổ biến để xác định các từ tương tự. Nltk đã có một triển khai cho số liệu khoảng cách chỉnh sửa, có thể được gọi theo cách sau:

import nltk
nltk.edit_distance("humpty", "dumpty")

Đoạn mã trên sẽ trả về 1, vì chỉ có một chữ cái khác nhau giữa hai từ.


1
Khoảng cách của Lavenshtien là thuật toán tồi tệ nhất mà bạn có thể sử dụng nếu NLP là những gì bạn định làm. Nếu 2 từ đồng nghĩa có một bộ ký tự khác nhau, LD sẽ hoạt động rất kém trong những trường hợp đó.
Đó là một cái bẫy

9

Ngoài những phản hồi rất tốt ở đây, bạn có thể thử SequenceMatcher trong thư viện python difflib.

https://docs.python.org/2/l Library / difflib.html

import difflib

a = 'Thanks for calling America Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d) 
### OUTPUT: 87.323943

Bây giờ hãy xem xét mã dưới đây:

a = 'Thanks for calling American Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d)
### OUTPUT: 88.88888

Bây giờ bạn có thể so sánh giá trị d để đánh giá sự giống nhau.


1
Nếu bạn cảm thấy seq.ratio () chậm, bạn có thể sử dụng seq.quick_ratio ()
Nabin

7

Nếu từ điển của bạn không quá lớn, cách tiếp cận phổ biến là lấy khoảng cách Levenshtein, về cơ bản sẽ tính xem có bao nhiêu thay đổi bạn phải thực hiện để chuyển từ từ này sang từ khác. Thay đổi bao gồm thay đổi một nhân vật, loại bỏ một nhân vật hoặc thêm một nhân vật. Một ví dụ từ Wikipedia :

lev (mèo con, ngồi) = 3

  • k itten -> s itten
  • sitt e n -> sitt i n
  • sittin -> sittin g

Dưới đây là một số công cụ Python trên Wikibooks.

Tuy nhiên, thuật toán để tính toán các khoảng cách này không rẻ. Nếu bạn cần thực hiện điều này trên quy mô lớn, có nhiều cách để sử dụng độ tương tự cosin trên các vectơ bi-gram nhanh hơn và dễ phân phối hơn nếu bạn cần tìm các kết hợp cho nhiều từ cùng một lúc. Tuy nhiên, chúng chỉ là một xấp xỉ với khoảng cách này.


(+1) cho Lev. số liệu khoảng cách. nltk đi kèm với việc thực hiện đã sẵn sàng. Độ tương tự cosine không phải là thước đo tương tự chuỗi tốt IMHO :)
Dawny33

Tôi đồng ý rằng nó tệ hơn nhiều so với khoảng cách Levenshtein nhưng nếu bạn cần kết hợp mờ giữa 2 bộ dữ liệu hàng triệu thì thực sự có thể làm điều đó trong một thời gian hợp lý do cần một số thủ thuật cộng với nhân ma trận
Jan van der Vegt

1
@ Dawny33 Tôi sẽ không đồng ý. Sự tương tự cosin không chỉ có tác dụng rất nhanh đối với tôi mà còn rất chính xác khi sử dụng đúng n-gram.
Mohit Motwani

3

Một kỹ thuật cũ và nổi tiếng để so sánh là thuật toán Soundex . Ý tưởng là để so sánh không phải bản thân các từ mà là xấp xỉ về cách chúng được phát âm. Ở mức độ nào thì điều này thực sự cải thiện chất lượng của kết quả mà tôi không biết.

Tuy nhiên, cảm thấy hơi lạ khi áp dụng một cái gì đó như Soundex vào kết quả từ một công cụ nhận dạng giọng nói thành văn bản. Đầu tiên bạn vứt bỏ thông tin về cách các từ được phát âm, sau đó bạn cố gắng thêm lại từ đầu. Sẽ là tốt hơn để kết hợp hai giai đoạn này.

Do đó, tôi hy vọng công nghệ tiên tiến trong lĩnh vực này sẽ làm được điều đó, và là một dạng phân loại thích ứng, ví dụ dựa trên các mạng lưới thần kinh. Google thực hiện trả lại nghiên cứu gần đây về Nhận dạng giọng nói với Mạng thần kinh .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.