Jaccard tương tự văn bản python

Trong khi làm việc trên các mô hình ngôn ngữ tự nhiên cho các công cụ tìm kiếm, tôi thường đặt câu hỏi “Hai từ này giống nhau đến mức nào?”, “Hai câu này giống nhau đến mức nào?” . Tôi đã nói về việc nhúng từ tùy chỉnh trong một bài đăng trước, trong đó nghĩa của từ được xem xét cho sự giống nhau của từ. Trong bài đăng trên blog này, chúng tôi sẽ xem xét nhiều hơn về các kỹ thuật cho sự giống nhau của câu hoặc tài liệu

Person in a library looking at all the books

Làm thế nào để chúng ta có ý nghĩa của tất cả các văn bản này xung quanh chúng ta?

Có một vài số liệu về độ tương tự của văn bản nhưng chúng tôi sẽ xem xét Độ tương tự của Jaccard và Độ tương tự của Cosine, đây là những số liệu phổ biến nhất

Jaccard tương tự

Độ tương tự của Jaccard hoặc giao điểm trên liên kết được định nghĩa là kích thước của giao điểm chia cho kích thước của liên kết của hai tập hợp. Hãy lấy ví dụ về hai câu

Câu 1. AI là bạn của chúng ta và nó rất thân thiện
Câu 2. Trí tuệ nhân tạo và con người luôn thân thiện

Để tính toán độ tương tự bằng cách sử dụng độ tương tự Jaccard, trước tiên chúng tôi sẽ thực hiện từ vựng để giảm các từ thành cùng một từ gốc. Trong trường hợp của chúng ta, “friend” và “friendly” sẽ trở thành “friend”, “has” và “have” sẽ trở thành “has”. Vẽ sơ đồ Venn của hai câu ta được

Venn Diagram for calculations

Biểu đồ Venn của hai câu cho sự giống nhau của Jaccard

Đối với hai câu trên, ta có hệ số tương tự Jaccard là 5/(5+3+2) = 0. 5 là kích thước của giao điểm của tập hợp chia cho tổng kích thước của tập hợp.
Mã cho sự giống nhau của Jaccard trong Python là.

def get_jaccard_sim(str1, str2): 
a = set(str1.split())
b = set(str2.split())
c = a.intersection(b)
return float(len(c)) / (len(a) + len(b) - len(c))

Một điều cần lưu ý ở đây là vì chúng ta sử dụng tập hợp nên “bạn” xuất hiện hai lần trong Câu 1 nhưng nó không ảnh hưởng đến tính toán của chúng ta — điều này sẽ thay đổi theo Độ tương tự Cosine

Cosin tương tự

Độ tương tự cosin tính toán độ tương tự bằng cách đo cosin của góc giữa hai vectơ. Điều này được tính như

Tính toán độ tương tự Cosine cho hai vectơ A và B [nguồn]

Với độ tương tự cosin, chúng ta cần chuyển đổi câu thành vectơ. Một cách để làm điều đó là sử dụng túi từ với TF (tần số thuật ngữ) hoặc TF-IDF (tần số thuật ngữ- tần suất tài liệu nghịch đảo). Việc lựa chọn TF hoặc TF-IDF phụ thuộc vào ứng dụng và không quan trọng đối với cách thức tương tự cosine thực sự được thực hiện - điều này chỉ cần các vectơ. TF tốt cho sự giống nhau của văn bản nói chung, nhưng TF-IDF tốt cho mức độ liên quan của truy vấn tìm kiếm

Một cách khác là sử dụng Word2Vec hoặc các nhúng từ tùy chỉnh của riêng chúng tôi để chuyển từ thành vectơ. Tôi đã nói về đào tạo nhúng từ tùy chỉnh của riêng chúng tôi trong một bài viết trước

Có hai điểm khác biệt chính giữa tf/ tf-idf với túi từ và nhúng từ.
1. tf / tf-idf tạo một số cho mỗi từ, nhúng từ thường tạo một vectơ cho mỗi từ.
2. tf / tf-idf tốt cho toàn bộ tài liệu phân loại, nhưng nhúng từ tốt cho việc xác định nội dung theo ngữ cảnh.

Hãy tính độ đồng dạng cosin cho hai câu này

Câu 1. AI là bạn của chúng ta và nó rất thân thiện
Câu 2. Trí tuệ nhân tạo và con người luôn thân thiện

Bước 1, chúng tôi sẽ tính Tần suất kỳ hạn bằng Bag of Words

Thuật ngữ Tần suất sau khi từ vựng của hai câu

Bước 2, Vấn đề chính với số lượng thuật ngữ được hiển thị ở trên là nó ưu tiên các tài liệu hoặc câu dài hơn. Một cách để giải quyết vấn đề này là chuẩn hóa thuật ngữ tần số với cường độ tương ứng hoặc định mức L2. Tính tổng bình phương của từng tần số và lấy căn bậc hai, chuẩn L2 của Câu 1 là 3. 3166 và Câu 2 là 2. 6458. Chia tần số hạn trên với các chỉ tiêu này, chúng tôi nhận được

Chuẩn hóa các tần số thuật ngữ bằng cách sử dụng Định mức L2

Bước 3, vì chúng ta đã chuẩn hóa hai vectơ để có độ dài bằng 1, chúng ta có thể tính toán độ tương tự cosin bằng tích vô hướng.
Cosine tương tự = (0. 302*0. 378) + (0. 603*0. 378) + (0. 302*0. 378) + (0. 302*0. 378) + (0. 302*0. 378) = 0. 684

Do đó độ đồng dạng cosin của hai câu bằng 0. 684 khác với Jaccard Độ giống nhau của hai câu giống hệt nhau là 0. 5 (đã tính ở trên)

Mã cho tính tương tự Cosine theo cặp của các chuỗi trong Python là

from collections import Counter
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def get_cosine_sim(*strs):
vectors = [t for t in get_vectors(*strs)]
return cosine_similarity(vectors)

def get_vectors(*strs):
text = [t for t in strs]
vectorizer = CountVectorizer(text)
vectorizer.fit(text)
return vectorizer.transform(text).toarray()

Sự khác biệt giữa Tương tự Jaccard và Tương tự Cosine

  1. Độ tương tự của Jaccard chỉ chiếm một bộ từ duy nhất cho mỗi câu/tài liệu trong khi độ tương tự cosine chiếm tổng chiều dài của các vectơ. (những vectơ này có thể được tạo từ túi thuật ngữ tần số hoặc tf-idf)
  2. Điều này có nghĩa là nếu bạn lặp lại từ “bạn” trong Câu 1 nhiều lần, thì độ tương tự cosin thay đổi nhưng độ tương tự Jaccard thì không. Ví dụ, nếu từ “bạn” được lặp lại trong câu đầu tiên 50 lần, độ tương tự cosin giảm xuống 0. 4 nhưng độ tương tự Jaccard vẫn ở mức 0. 5
  3. Độ tương tự của Jaccard tốt cho các trường hợp trùng lặp không quan trọng, độ tương tự cosine tốt cho các trường hợp trùng lặp quan trọng trong khi phân tích độ tương tự của văn bản. Đối với hai mô tả sản phẩm, sẽ tốt hơn nếu sử dụng độ tương tự của Jaccard vì việc lặp lại một từ không làm giảm độ tương đồng của chúng

Nếu bạn biết nhiều ứng dụng hơn cho từng ứng dụng, vui lòng đề cập trong phần bình luận bên dưới vì nó sẽ giúp ích cho những người khác. Điều này kết thúc blog của tôi về tổng quan các số liệu tương tự văn bản. Chúc may mắn trong những khám phá của riêng bạn với văn bản

Một trong những cuốn sách hay nhất mà tôi tìm thấy về chủ đề truy xuất thông tin là Introduction to Information Retrieval, đây là một cuốn sách tuyệt vời bao gồm nhiều khái niệm về NLP, truy xuất thông tin và tìm kiếm.

Intro to Information Retrieval Book Cover

Một trong những cuốn sách hay nhất về chủ đề này. Giới thiệu về Truy xuất Thông tin

Ngoài ra, hãy xem PODCAST của tôi. Tôi có một podcast tên là “The Data Life Podcast”. Bạn có thể nghe thấy điều này ở bất cứ nơi nào bạn nhận được podcast của mình. Trong tập này, bạn sẽ nghe một cuộc trò chuyện thực sự thú vị với Paul Azunre (tác giả của Manning Book Transfer Learning in NLP) về các xu hướng trong BERT, Elmo, nhúng từ, v.v.