2012-10-06 35 views
12

Tôi đang làm việc trên một ứng dụng cố gắng khớp một tập hợp các tên thực thể "lộn xộn" có khả năng để "sạch" tên thực thể trong danh sách tham chiếu. Tôi đã làm việc với khoảng cách chỉnh sửa và các thuật toán kết hợp mờ phổ biến khác, nhưng tôi tự hỏi liệu có cách tiếp cận nào tốt hơn cho phép trọng số hạn hay không, như vậy các thuật ngữ phổ biến được giảm cân trong kết quả mờ.chuỗi mờ phù hợp với trọng số kỳ hạn

Hãy xem ví dụ này, sử dụng thư viện difflib của Python. Tôi đang làm việc với các tên tổ chức, có nhiều thành phần tiêu chuẩn hóa chung và do đó không thể được sử dụng để phân biệt giữa các thực thể.

from difflib import SequenceMatcher 
e1a = SequenceMatcher(None, "ZOECON RESEARCH INSTITUTE", 
          "LONDON RESEARCH INSTITUTE") 
print e1a.ratio() 
0.88 

e1b = SequenceMatcher(None, "ZOECON", "LONDON") 
print e1b.ratio() 
0.333333333333 

e2a = SequenceMatcher(None, "WORLDWIDE SEMICONDUCTOR MANUFACTURING CORP", 
          "TAIWAN SEMICONDUCTOR MANUFACTURING CORP") 
print e2a.ratio() 
0.83950617284 

e2b = SequenceMatcher(None, "WORLDWIDE", 
          "TAIWAN") 
print e2b.ratio() 
0.133333333333 

Cả hai ví dụ điểm số cao trên chuỗi đầy đủ vì RESEARCH, INSTITUTE, SEMICONDUCTOR, MANUFACTURING, và CORP là tần số cao, điều khoản chung trong nhiều tên tổ chức. Tôi đang tìm kiếm bất kỳ ý tưởng nào về cách tích hợp các tần số cụm vào kết hợp chuỗi mờ (không nhất thiết phải sử dụng difflib), sao cho điểm số không bị ảnh hưởng bởi các thuật ngữ phổ biến và kết quả có thể trông giống như "e1b" và " e2b "ví dụ.

Tôi nhận ra rằng tôi có thể tạo danh sách "thường xuyên" và loại trừ những từ so sánh, nhưng tôi muốn sử dụng tần số nếu có thể bởi vì ngay cả những từ phổ biến thêm một số thông tin và điểm cắt bất kỳ danh sách nào cũng sẽ tùy ý.

+2

[Whoosh] (https://bitbucket.org/mchaput/whoosh/wiki/Home) trông thú vị, đặc biệt là ['score'] (http://packages.python.org/Whoosh/api/scoring. html) và [whoosh.reading.TermInfo] (http://packages.python.org/Whoosh/api/reading.html?highlight=frequency#whoosh.reading.TermInfo) 'doc_frequency() 'và' weight() ' –

+1

Bạn có quyền truy cập vào toàn bộ tập hợp các tên phù hợp với mờ không? Nếu vậy, bạn có thể sử dụng tf-idf để huấn luyện một mô hình phù hợp mờ. –

+0

Bạn có thể chia các chuỗi và tính toán sự khác biệt trên mỗi phần. Điều này sẽ giúp bạn trong các tình huống _some_ nơi bạn có cùng tên nhưng chỉ với một từ khác biệt. Nhưng điều này có lẽ không đủ mạnh cho những gì bạn muốn làm. – Bakuriu

Trả lời

2

Đây là một ý tưởng kỳ lạ cho bạn:

Nén dữ liệu nhập của bạn và tìm khác biệt.

Bạn có thể sử dụng ví dụ: Huffman hoặc dictionary coder để nén đầu vào của bạn, tự động xử lý các thuật ngữ thông dụng. Tuy nhiên, trong ví dụ của bạn, Luân Đôn có lẽ là một từ tương đối phổ biến, trong khi Lundon sai chính tả thì không có gì khác biệt, và sự khác biệt giữa các thuật ngữ nén cao hơn nhiều so với các thuật ngữ thô.

1

Theo ý kiến ​​của tôi, một giải pháp chung sẽ không bao giờ phù hợp với ý tưởng tương tự của bạn. Ngay sau khi bạn có một số kiến ​​thức tiềm ẩn về dữ liệu của bạn, bạn phải đặt nó bằng cách nào đó vào mã. Mà imediately disqualifies một giải pháp cố định hiện có.

Có lẽ bạn nên xem http://nltk.org/ để có ý tưởng về một số kỹ thuật NLP. Bạn không cho chúng tôi biết đủ về dữ liệu của bạn, nhưng một trình gắn thẻ POS có thể giúp xác định các điều khoản có liên quan hơn và ít hơn. Cơ sở dữ liệu có sẵn với tên thành phố, quốc gia, ... có thể giúp dọn sạch dữ liệu trước khi xử lý thêm.

Có nhiều công cụ có sẵn, nhưng để có được đầu ra chất lượng cao, bạn sẽ cần một giải pháp được tùy chỉnh cho dữ liệu và trường hợp sử dụng của bạn.

+0

Tôi hài lòng với giải pháp ứng dụng cụ thể. Dữ liệu của tôi chỉ là tên thực thể, không may, không có bất kỳ ngữ cảnh nào. Tôi thích ý tưởng gắn thẻ POS, nhưng tôi sợ vì tôi chỉ có những cái tên giống như 95% những gì xuất phát từ trình gắn thẻ sẽ là của NNP. – rjf

+0

Trình gắn thẻ POS không bị giới hạn ở các thẻ "mặc định". Bạn có thể tự gắn thẻ một ví dụ, sử dụng các thẻ của riêng bạn (CITY, NAME, TYPE, ...) và đào tạo một người gắn thẻ bằng cách sử dụng dữ liệu đó. Có nhiều lựa chọn hơn tôi có thể viết ở đây và để cung cấp thêm gợi ý, tôi sẽ phải "chơi" với dữ liệu của bạn. Lấy làm tiếc. – Achim

2

cách tách từng chuỗi thành danh sách các từ và chạy so sánh của bạn trên từng từ để có danh sách chứa điểm số của từ phù hợp. khi đó, bạn có thể tính điểm số trung bình, tìm đối sánh gián tiếp thấp nhất/cao nhất ...

cung cấp cho bạn khả năng thêm trọng lượng của riêng bạn.

bạn dĩ nhiên sẽ cần xử lý các khoảng trống như ..

"công ty london cho da"

"london công ty cho da"

1

tôi chỉ đề xuất một cách tiếp cận khác nhau. Vì bạn đã đề cập rằng tên thực thể đến từ danh sách tham chiếu, tôi tự hỏi bạn có thông tin ngữ cảnh bổ sung hay không, như tên đồng tác giả, tiêu đề sản phẩm/giấy, địa chỉ w/thành phố, tiểu bang, quốc gia?

Nếu bạn có một số ngữ cảnh hữu ích như trên, bạn thực sự có thể xây dựng biểu đồ các thực thể trong mối quan hệ giữa chúng. Quan hệ có thể được, ví dụ:

Author-paper relation 
Co-author relation 
author-institute relation 
institute-city relation 
.... 

Sau đó, nó là thời gian để sử dụng một cách tiếp cận có độ phân giải thực thể dựa trên đồ thị mô tả chi tiết tại địa chỉ:

Cách tiếp cận có hiệu suất rất tốt trên miền đồng tác giả-giấy.

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