2016-04-25 18 views
9

Hầu hết commonly misspelled English words là trong vòng hai hoặc ba lỗi chính tả (một sự kết hợp của thay s, chèn i, hoặc xóa thư d) từ hình thức đúng của họ. I E. lỗi trong cặp từ absence - absense có thể được tóm tắt là có 1 s, 0 i và 0 d.Làm cách nào để từ kết hợp mờ thành một từ đầy đủ (và chỉ có một từ đầy đủ) trong một câu?

Một người có thể kết hợp mờ để tìm từ và lỗi chính tả của họ bằng cách sử dụng để thay thế lạiregex python module.

Bảng dưới đây tóm tắt những nỗ lực thực hiện để phân khúc mờ một lời quan tâm từ một số câu:

enter image description here

  • Regex1 tìm word phù hợp nhất trong sentence cho phép tối đa là 2 lỗi
  • Regex2 tìm thấy kết quả phù hợp nhất word trong sentence cho phép tại hầu hết 2 lỗi khi cố gắng hoạt động chỉ trên (tôi nghĩ) toàn bộ từ
  • Regex3 tìm thấy kết quả tốt nhất word trong sentence cho phép tại hầu hết 2 lỗi khi chỉ hoạt động trên (tôi nghĩ) toàn bộ từ. Tôi sai rồi.
  • Regex4 tìm word phù hợp nhất trong sentence phép tại nhất 2 lỗi trong khi (tôi nghĩ) tìm kiếm kết thúc trận đấu là một ranh giới từ

Làm thế nào tôi sẽ viết một biểu thức regex mà loại bỏ, nếu có thể, các kết quả mờ ảo sai và dương tính giả trên các cặp từ-câu này?

Một giải pháp có thể là chỉ so sánh các từ (chuỗi ký tự được bao quanh bởi khoảng trắng hoặc đầu/cuối của một dòng) trong câu với từ lãi (từ chính). Nếu có một kết quả mờ (e < = 2) giữa từ chính và một từ trong câu, sau đó trả lại từ đầy đủ (và chỉ từ đó) từ câu.

Sao chép dataframe sau vào clipboard của bạn:

  word     sentence 
0  cub cadet    cub cadet 42 
1  plastex    vinyl panels 
2   spt heat and air conditioner 
3  closetmaid    closetmaid 
4   ryobi   batteries kyobi 
5   ryobi  10' table saw ryobi 
6 trafficmaster   traffic mast5er 

Bây giờ sử dụng

import pandas as pd, regex 
df=pd.read_clipboard(sep='\s\s+') 

test=df 
test['(?b)(?:WORD){e<=2}']=df.apply(lambda x: regex.findall(r'(?b)(?:'+x['word']+'){e<=2}', x['sentence']),axis=1) 
test['(?b)(?:\wWORD\W){e<=2}']=df.apply(lambda x: regex.findall(r'(?b)(?:\w'+x['word']+'\W){e<=2}', x['sentence']),axis=1) 
test['(?V1)(?b)(?:\w&&WORD){e<=2}']=df.apply(lambda x: regex.findall(r'(?V1)(?b)(?:\w&&'+x['word']+'){e<=2}', x['sentence']),axis=1) 
test['(?V1)(?b)(?:WORD&&\W){e<=2}']=df.apply(lambda x: regex.findall(r'(?V1)(?b)(?:'+x['word']+'&&\W){e<=2}', x['sentence']),axis=1) 

Để tải bảng vào môi trường của bạn.

+0

Đây là những công cụ sửa đổi nội tuyến '(? V1)', '(? B)' và chúng có ý nghĩa gì? – sln

+0

Làm thế nào để bạn so sánh một từ _fuzzy_ với một từ thực? Bạn đang sử dụng một từ điển của một số loại? Cách đơn giản nhất là chia nhỏ khoảng trắng và sử dụng cây đại dương tùy chỉnh mà bạn viết tất cả các từ trong từ điển. Khi bạn đi qua cây, bạn có thể cho phép các chữ cái _N_ không đúng vị trí. Bạn sẽ cần mã phân nhánh đặc biệt. – sln

+0

@sln: anh ấy đang nói về mô-đun này: https://pypi.python.org/pypi/regex –

Trả lời

2

Làm '(?b)\m(?:WORD){e<=2}\M'

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