Làm thế nào để bạn khớp các chuỗi tương tự trong python?

Khi chúng tôi xử lý dữ liệu từ các nguồn khác nhau, chúng tôi thường gặp phải một vấn đề – một số chuỗi có thể được đánh vần khác nhau, nhưng chúng có cùng ý nghĩa. Con người chúng ta có thể xác định ý nghĩa ngay lập tức, nhưng máy móc không thể. Hướng dẫn ngắn này sẽ trình bày cách tìm các chuỗi tương tự bằng Python

Máy móc không thực sự hiểu ngôn ngữ của con người…

Ví dụ, chúng ta có hai câu

>>> s1 = "The leaf is green, and the pumpkin is orange, and the apple is red, and the banana is yellow."
>>> s2 = "the leaf is green, banana yellow, apple red, pumpkin orange"

Con người chúng ta có thể nói rằng

>>> s1 == s2
False
4 và
>>> s1 == s2
False
5 có cùng ý nghĩa. Nhưng trong con mắt của một cái máy, chúng là hai câu khác nhau.

>>> s1 == s2
False

Vậy làm sao để máy nhận ra hai câu này có nghĩa giống nhau?

Giới thiệu Khoảng cách Levenshtein

Hóa ra có một công thức gọi là khoảng cách Levenshtein đo lượng chỉnh sửa một ký tự tối thiểu cần thiết để thay đổi một chuỗi này thành chuỗi khác. Khoảng cách này được đặt theo tên của nhà toán học Liên Xô Vladimir Levenshtein. Trong hướng dẫn này, chúng tôi sẽ bỏ qua tất cả các chi tiết lý thuyết, nhưng nếu bạn quan tâm, Wikipedia là một điểm khởi đầu tốt

So khớp chuỗi mờ trong Python

Thuật ngữ thích hợp để tìm các chuỗi tương tự được gọi là so khớp chuỗi mờ. Chúng tôi sẽ sử dụng một thư viện gọi làuzzywuzzy. Mặc dù nó có một cái tên buồn cười, nhưng nó là một thư viện rất phổ biến để so khớp chuỗi mờ. Thư viện Fuzzywuzzy có thể tính toán khoảng cách Levenshtein và nó có một vài chức năng mạnh mẽ khác để giúp chúng tôi khớp chuỗi mờ

Hãy bắt đầu từ một cái gì đó dễ dàng, như so sánh hai từ. Sau đó, chúng tôi sẽ chuyển sang các tình huống phức tạp hơn, chẳng hạn như so sánh nhiều câu. chúng ta đi đây

Trước tiên hãy cài đặt thư viện. Nếu bạn chưa quen với blog này và cần trợ giúp cài đặt Python và các thư viện, hãy đọc hướng dẫn này tại đây

pip install fuzzywuzzy

Ví dụ từ đơn

Bắt đầu với ví dụ đơn giản nhất. Bạn nghĩ gì về máy tính xem hai từ này. “Bezos” và “bezos”? . Vì chữ hoa “B” không bằng chữ thường “b”

>>> "Bezos" == "bezos"
False

Thật dễ dàng để ghép hai từ này. chúng ta có thể đơn giản làm cho cả hai từ đều là chữ thường [hoặc chữ hoa], sau đó so sánh lại. Chúng ta có thể sử dụng các phương thức String

>>> s1 == s2
False
6 /
>>> s1 == s2
False
7 trực tiếp trên bất kỳ dữ liệu chuỗi đã cho nào

________số 8

Ví dụ về nhiều từ

Bạn có thể đã biết rằng “Jeff” là tên viết tắt của “Jeffery”, nhưng có vẻ như máy móc vẫn chưa biết điều đó

>>> n1 = "Jeff Bezos"
>>> n2 = "Jeffery Bezos"
>>> n1 == n2
False

Bây giờ, sử dụng kỹ thuật so khớp chuỗi mờ, chúng tôi nhận được một số 87. Phương pháp

>>> s1 == s2
False
8 tính tỷ lệ khoảng cách Levenshtein. Cá nhân tôi giải thích các tỷ lệ này là “xác suất tương đồng”. Tỷ lệ này càng cao, hai từ càng giống nhau

>>> s1 == s2
False
1

Bây giờ, hãy giới thiệu một biến khác n3 = “Bezos”, sau đó tính tỷ lệ khoảng cách Levenshtein với cả “Jeff Bezos” và “Jeffery Bezos”

Kết quả phù hợp rất kém. Điều này là do theo định nghĩa về khoảng cách Levenshtein, phải mất nhiều lần chỉnh sửa để thay đổi “Bezos” thành “Jeff Bezos” hoặc “Jeffery Bezos”

>>> s1 == s2
False
2

Chúng ta có thể sử dụng phương pháp

>>> s1 == s2
False
9 củauzzywuzzy để trợ giúp trong tình huống này. Phương thức
pip install fuzzywuzzy
0 cố gắng khớp các chuỗi con trong mỗi chuỗi mẫu. Trong trường hợp này, vì “Bezos” tồn tại trong cả n1 hoặc n2, chúng tôi nhận được giá trị khớp là 100 trong cả hai trường hợp

>>> s1 == s2
False
5

Ví dụ câu

Hãy tiến thêm một bước và so sánh hai câu

>>> s1 == s2
False
6

Lưu ý một câu có cả chữ hoa và chữ thường, còn câu kia chỉ chứa chữ hoa. Chúng ta cần giúp hàm

pip install fuzzywuzzy
1 một chút bằng cách chuyển đổi cả hai câu thành chữ thường

Hiệu suất vẫn còn rất kém với các phương pháp

>>> s1 == s2
False
8. Hãy nhớ rằng, tỷ lệ càng cao, trận đấu càng gần. Phương pháp
pip install fuzzywuzzy
0 cũng không giúp được gì nhiều trong trường hợp này. Điều này là do hai câu đã đảo ngược thứ tự và không có chuỗi nào là tập hợp con của chuỗi kia

Đừng lo lắng, vì thư việnuzzywuzzy cung cấp các chức năng mạnh mẽ khác để so sánh chuỗi

>>> s1 == s2
False
0

Để biết tại sao hàm

pip install fuzzywuzzy
4 lại khớp hoàn hảo, chúng ta cần hiểu hàm này làm gì, đó là những điều sau

  • “Tokenizes” các câu. Có nghĩa là nó chia câu thành các từ riêng lẻ
  • Chuyển đổi tất cả các từ thành chữ thường
  • Xóa dấu câu
  • Sắp xếp các mã thông báo chuỗi [i. e. từ riêng lẻ] theo thứ tự bảng chữ cái
  • Nối các từ riêng lẻ sau đó so sánh các chuỗi mới được tạo thành

Rõ ràng là vào cuối quá trình trên, hai chuỗi

pip install fuzzywuzzy
5 và
pip install fuzzywuzzy
6
về cơ bản là giống nhau, không có gì ngạc nhiên khi chúng ta có một .

Ví dụ về câu – Tiếp tục

Bây giờ, hãy xem lại câu hỏi ban đầu của chúng ta ở phần đầu của hướng dẫn này. Trước tiên chúng ta sẽ thử hàm

pip install fuzzywuzzy
7

>>> s1 == s2
False
1

Lần này,

pip install fuzzywuzzy
8 cho tỷ lệ 77. Lý do là câu
pip install fuzzywuzzy
9 chứa nhiều từ trùng lặp hơn câu
>>> "Bezos" == "bezos"
False
0
, chẳng hạn như “and”, “the”, và “is”. Những từ đó xuất hiện nhiều lần trong câu
pip install fuzzywuzzy
9, nhưng chỉ một lần trong câu
>>> "Bezos" == "bezos"
False
2. Tuy nhiên, những từ trùng lặp đó không cung cấp thêm ý nghĩa cho câu đầu tiên, chúng ta cần giúp máy lọc chúng.

Fuzzywuzzy cung cấp một chức năng hữu ích khác để giải quyết vấn đề này.

>>> "Bezos" == "bezos"
False
3

Hàm này rất giống với

pip install fuzzywuzzy
4. Sự khác biệt duy nhất giữa hai chức năng mã thông báo là thay vì sắp xếp các mã thông báo riêng lẻ, nó áp dụng một
>>> "Bezos" == "bezos"
False
5 cho danh sách các từ riêng lẻ. Vậy a set[] làm gì trong Python? . Tính năng này làm cho
>>> "Bezos" == "bezos"
False
6 trở thành một cách thuận tiện để xóa các mục trùng lặp khỏi một lần lặp.

>>> s1 == s2
False
2

Hãy thử trên hai chuỗi

pip install fuzzywuzzy
9 và
>>> "Bezos" == "bezos"
False
2. Một lần nữa, một trận đấu đẹp hoàn hảo. Điều này là do
>>> "Bezos".lower[] == "bezos".lower[]
True

>>> "Bezos".upper[] == "bezos".upper[]
True
0 đã loại bỏ tất cả các từ trùng lặp và những từ còn lại trong hai chuỗi khớp khá tốt

>>> s1 == s2
False
3

Cái gì tiếp theo?

Bây giờ chúng ta đã được trang bị kiến ​​thức về khớp chuỗi mờ trong Python. Trong hướng dẫn tiếp theo, chúng ta sẽ xem qua một số ví dụ về cách sử dụng khớp chuỗi mờ cùng với gấu trúc và Excel

Chủ Đề