Một số cách tiêu chuẩn để tính toán khoảng cách giữa các tài liệu là gì?


34

Khi tôi nói "tài liệu", tôi nghĩ đến các trang web như các bài báo và tin tức trên Wikipedia. Tôi thích câu trả lời đưa ra số liệu khoảng cách từ vựng vanilla hoặc số liệu khoảng cách ngữ nghĩa hiện đại, với ưu tiên mạnh mẽ hơn cho cái sau.

Câu trả lời:


48

Có một số cách khác nhau để giải quyết vấn đề này tùy thuộc vào chính xác lượng thông tin ngữ nghĩa bạn muốn giữ lại và mức độ dễ dàng của tài liệu của bạn (tài liệu html có thể rất khó để token hóa, nhưng bạn có thể hình dung được điều gì đó bằng thẻ và ngữ cảnh .)

Một số trong số chúng đã được đề cập bởi ffriend, và các vectơ đoạn của user1133029 là một phần thực sự vững chắc, nhưng tôi chỉ hình dung rằng tôi sẽ đi sâu hơn về kìm và các cách tiếp cận khác nhau.

  • Khoảng cách Cosine - Đã thử một khoảng cách đúng, cosine có lẽ là số liệu khoảng cách phổ biến nhất được sử dụng rộng rãi trên nhiều miền. Như đã nói, có rất ít thông tin trong khoảng cách cosin thực sự có thể được ánh xạ trở lại bất cứ thứ gì có ngữ nghĩa, dường như không lý tưởng cho tình huống này.
  • Khoảng cách Levenshtein - Còn được gọi là edit distance, điều này thường chỉ được sử dụng ở cấp độ mã thông báo riêng lẻ (từ, bigrams, v.v ...). Nói chung, tôi không đề xuất số liệu này vì nó không chỉ loại bỏ bất kỳ thông tin ngữ nghĩa nào, mà còn có xu hướng xử lý các thay đổi từ rất khác nhau rất giống nhau, nhưng nó là một số liệu cực kỳ phổ biến cho loại điều này
  • LSA - Là một phần của kho kỹ thuật lớn khi đánh giá độ tương tự của tài liệu được gọi topic modeling. LSA gần đây đã lỗi thời và theo kinh nghiệm của tôi, nó không hoàn toàn là cách tiếp cận mô hình chủ đề mạnh nhất, nhưng nó tương đối đơn giản để thực hiện và có một vài triển khai nguồn mở
  • LDA - Cũng là một kỹ thuật được sử dụng cho topic modeling, nhưng nó khác với LSAviệc nó thực sự học các biểu diễn bên trong có xu hướng trơn tru và trực quan hơn. Nói chung, kết quả bạn nhận được LDAlà tốt hơn cho mô hình tương tự tài liệu hơn LSA, nhưng không hoàn toàn tốt cho việc học cách phân biệt mạnh mẽ giữa các chủ đề.
  • Phân bổ Pachinko - Là một phần mở rộng thực sự gọn gàng trên LDA. Nhìn chung, đây chỉ là một phiên bản được cải tiến đáng kể LDA, với nhược điểm duy nhất là phải mất một chút thời gian để đào tạo và việc triển khai nguồn mở khó hơn một chút
  • word2vec - Google đã nghiên cứu một loạt các kỹ thuật để giảm từ ngữ và tài liệu một cách thông minh thành các vectơ hợp lý hơn so với các vectơ thưa thớt được tạo ra bởi các kỹ thuật như Count VectorizersTF-IDF. Word2vec là tuyệt vời vì nó có một số triển khai nguồn mở. Khi bạn có vectơ, bất kỳ số liệu tương tự nào khác (như khoảng cách cosine) có thể được sử dụng trên đầu trang với hiệu quả cao hơn đáng kể.
  • doc2vec - Còn được gọi là paragraph vectors, đây là tài liệu mới nhất và lớn nhất trong một loạt các bài báo của Google, xem xét các biểu diễn vector dày đặc của các tài liệu. Các gensimthư viện trong python có một thực hiện word2vecđó là đủ đơn giản rằng nó khá hợp lý có thể được thừa hưởng để xây dựng doc2vec, nhưng hãy chắc chắn để giữ cho giấy phép ghi nhớ nếu bạn muốn đi xuống con đường này

Hy vọng rằng sẽ giúp, cho tôi biết nếu bạn có bất kỳ câu hỏi.


6

Có một số biện pháp khoảng cách ngữ nghĩa, mỗi biện pháp đều có ưu và nhược điểm. Đây chỉ là một vài trong số họ:

  • khoảng cách cosin , sản phẩm bên trong giữa các vectơ đặc trưng tài liệu;
  • LSA , một mô hình dựa trên vectơ khác, nhưng sử dụng SVD để khử nhiễu ma trận tài liệu gốc;
  • WordNet dựa trên cơ sở, con người xác minh, mặc dù hầu như không thể mở rộng.

Bắt đầu với một cách tiếp cận đơn giản nhất và sau đó di chuyển xa hơn dựa trên các vấn đề cho trường hợp cụ thể của bạn.


1
Lưu ý rằng khi thực hiện LSA, thông thường bạn sử dụng khoảng cách cosine trên các phép chiếu LSA của bộ dữ liệu gốc. Chỉ cần làm rõ.
Simon

6

Theo kinh nghiệm, tôi đã tìm thấy LSA vượt trội hơn rất nhiều so với LDA mỗi lần và trên mỗi tập dữ liệu tôi đã thử. Tôi đã nói chuyện với những người khác đã nói điều tương tự. Nó cũng được sử dụng để chiến thắng một số cuộc thi SemEval để đo lường sự tương đồng về ngữ nghĩa giữa các tài liệu, thường được kết hợp với một biện pháp dựa trên wordnet, vì vậy tôi sẽ không nói rằng nó lỗi thời, hoặc chắc chắn là kém hơn LDA, tốt hơn cho mô hình chủ đề và không giống nhau về ngữ nghĩa trong kinh nghiệm của tôi, trái với những gì một số người trả lời đã nêu.

Nếu bạn sử dụng gensim (một thư viện python), nó có LSA, LDA và word2vec, vì vậy bạn có thể dễ dàng so sánh 3. doc2vec là một ý tưởng hay, nhưng không có quy mô tốt và bạn có thể sẽ phải tự thực hiện nó như tôi không biết về bất kỳ triển khai nguồn mở nào. Nó không mở rộng tốt như đối với mỗi tài liệu, một mô hình mới và riêng biệt phải được xây dựng bằng SGD, một thuật toán học máy chậm. Nhưng nó có thể sẽ cung cấp cho bạn kết quả chính xác nhất. LSA và LDA cũng không có quy mô tốt (tuy nhiên word2vec), nói chung quy mô LDA tệ hơn. Tuy nhiên, việc triển khai của Gensim rất nhanh, vì nó sử dụng SVD lặp.

Một lưu ý khác, nếu bạn sử dụng word2vec, bạn vẫn sẽ phải xác định một cách để tạo các vectơ từ các tài liệu, vì nó cung cấp cho bạn một vectơ khác nhau cho mỗi từ. Cách đơn giản nhất để làm điều này là bình thường hóa mỗi vectơ và lấy giá trị trung bình trên tất cả các vectơ từ trong tài liệu hoặc lấy một giá trị trung bình bằng trọng số idf của mỗi từ. Vì vậy, nó không đơn giản như 'sử dụng word2vec', bạn sẽ cần phải làm gì đó hơn nữa để tính toán độ tương tự của tài liệu.

Cá nhân tôi sẽ đi với LSA, vì tôi đã thấy nó hoạt động tốt theo kinh nghiệm và thư viện của Gensim có quy mô rất tốt. Tuy nhiên, không có bữa trưa miễn phí, vì vậy tốt nhất nên thử từng phương pháp và xem phương pháp nào phù hợp hơn với dữ liệu của bạn.


Chính xác thì bạn đã sử dụng LSA như thế nào? Điều đáng chú ý là LDA thực sự là một trình bao bọc khá mỏng xung quanh LSA (đó là pLSA với một dirichlet trước đó) đã được chứng minh bằng thực nghiệm để tăng khả năng khái quát hóa. Bạn gần như chắc chắn sẽ thấy độ chính xác tốt hơn với LSA, nhưng đó thường là kết quả của việc cung cấp quá mức, đây là một vấn đề rất đáng chú ý với LSA. Ngoài ra, chính xác những gì bạn có nghĩa là bằng cách mở rộng ở đây? doc2vec thực sự không yêu cầu một mô hình mới cho mỗi tài liệu và để tính toán, không có sự khác biệt đáng chú ý nào giữa LSA và LDA, cả hai đều có khả năng mở rộng.
Slater Victoroff

Tôi đã không quan sát thấy phù hợp với LSA, và như tôi đã nói, tôi đã gặp nhiều người khác, những người đã thấy hiệu suất tốt hơn so với LDA. Ngoài ra, tôi đã thấy LSA được sử dụng trong nhiều mục chiến thắng trong các cuộc thi bán kết, tôi chưa bao giờ thấy LDA được sử dụng trong một mục chiến thắng. Đó là hội nghị học thuật để so sánh sự giống nhau về ngữ nghĩa giữa các tài liệu, vì vậy tôi cho rằng họ biết họ đang làm gì. Doc2vec, nếu bạn đang đề cập đến việc triển khai vectơ đoạn văn của Mikolov, thì SGD trên mỗi tài liệu riêng biệt. Vì vậy, nó rất chậm.
Simon

@SlaterVictoroff Tôi nghĩ rằng việc nói quá nhiều điều để nói rằng nó quá mức. LDA được biết đến là kém đối với các trường hợp tìm kiếm / phục hồi thông tin và tìm kiếm thông tin, LSA theo kinh nghiệm đã được chứng minh là hoạt động tốt hơn nhiều và phù hợp với kinh nghiệm của tôi cũng như tôi muốn xác thực những phát hiện này dựa trên dữ liệu của chúng tôi. Các phiên bản của Doc2Vec thực hiện giảm độ dốc cho mỗi tài liệu, nó phụ thuộc vào thuật toán được sử dụng trong Doc2Vec, vì điều đó thường đề cập đến rất nhiều thuật toán khác nhau.
Simon

3

Trạng thái của nghệ thuật dường như là "vectơ đoạn" được giới thiệu trong một bài báo gần đây: http://cs.stanford.edu/~quocle/par Đoạn_vector.pdf . Khoảng cách Cosine / Euclide giữa các vectơ đoạn có thể sẽ hoạt động tốt hơn bất kỳ cách tiếp cận nào khác. Điều này có lẽ không khả thi nhưng do thiếu các triển khai nguồn mở.

Điều tốt nhất tiếp theo là khoảng cách cosin giữa các vectơ LSA hoặc khoảng cách cosin giữa các vectơ BOW thô. Đôi khi nó hoạt động tốt hơn để chọn các chương trình trọng số khác nhau, như TF-IDF.


Lưu ý ý kiến ​​của tôi dưới đây về khả năng mở rộng vector đoạn. Kỹ thuật này có vẻ rất hứa hẹn, nhưng khó thực hiện và không có quy mô tốt, vì bạn đang thực hiện một SGD riêng cho mỗi tài liệu, rất tốn kém, nếu tôi nhớ chính xác bài báo
Simon

1

Nó rất hữu ích khi có trong túi của bạn các công cụ gia đình của các thuật toán băm nhạy cảm cục bộ . Gia đình này không phải là ngữ nghĩa gì cả. Trên thực tế là coi văn bản là một chuỗi các bit. Tôi thấy nó hữu ích trong các tập dữ liệu bẩn khi cùng một văn bản xuất hiện nhiều lần với sự khác biệt nhỏ.

Bạn có thể sử dụng ssdeep (dựa trên hàm băm Nilsimsa ) để xác định các tài liệu đó. Ssdeep ban đầu được lên kế hoạch cho lĩnh vực thư rác. Kẻ gửi thư rác thường thực hiện các thay đổi nhỏ trong tin nhắn (thêm khoảng trắng) để ngăn phát hiện bằng chữ ký chính xác (ví dụ: md5 ).

Vì nhiều phiên bản của gần như cùng một tài liệu trong cùng một bộ dữ liệu sẽ gây ra sự tàn phá cho các phương pháp thống kê sẽ được áp dụng trên nó, nên việc dọn dẹp như vậy có thể rất có lợi.

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.