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
4 và >>> s1 == s2
False
>>> 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ố 8Ví 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
1Bâ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
2Chú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
5Ví dụ câu
Hãy tiến thêm một bước và so sánh hai câu
>>> s1 == s2
False
6Lư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ườngHiệ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
1Lần này,
8 cho tỷ lệ 77. Lý do là câu pip install fuzzywuzzy
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
3Hà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
2Hã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
3Cá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