2012-07-08 38 views
6

Tôi có thể nói difflib.get_close_matches() để bỏ qua trường hợp như thế nào? Tôi có một từ điển có định dạng được xác định bao gồm viết hoa. Tuy nhiên, chuỗi thử nghiệm có thể có cách viết hoa đầy đủ hoặc không viết hoa và các chuỗi này phải tương đương nhau. Tuy nhiên, kết quả cần phải được viết hoa đúng cách, vì vậy tôi không thể sử dụng từ điển đã sửa đổi.Bỏ qua trường hợp với difflib.get_close_matches()

import difflib 

names = ['Acacia koa A.Gray var. latifolia (Benth.) H.St.John', 
    'Acacia koa A.Gray var. waianaeensis H.St.John', 
    'Acacia koaia Hillebr.', 
    'Acacia kochii W.Fitzg. ex Ewart & Jean White', 
    'Acacia kochii W.Fitzg.'] 
s = 'Acacia kochi W.Fitzg.' 

# base case: proper capitalisation 
print(difflib.get_close_matches(s,names,1,0.9)) 

# this should be equivalent from the perspective of my program 
print(difflib.get_close_matches(s.upper(),names,1,0.9)) 

# this won't work because of the dictionary formatting 
print(difflib.get_close_matches(s.upper().capitalize(),names,1,0.9)) 

Output:

['Acacia kochii W.Fitzg.'] 
[] 
[] 

đang làm việc:

Dựa trên câu trả lời Hugh Bothwell, tôi đã sửa đổi các mã như sau để có được một giải pháp làm việc (mà cũng nên làm việc khi hơn hơn một kết quả được trả lại):

import difflib 

names = ['Acacia koa A.Gray var. latifolia (Benth.) H.St.John', 
    'Acacia koa A.Gray var. waianaeensis H.St.John', 
    'Acacia koaia Hillebr.', 
    'Acacia kochii W.Fitzg. ex Ewart & Jean White', 
    'Acacia kochii W.Fitzg.'] 
test = {n.lower():n for n in names}  
s1 = 'Acacia kochi W.Fitzg.' # base case 
s2 = 'ACACIA KOCHI W.FITZG.' # test case 

results = [test[r] for r in difflib.get_close_matches(s1.lower(),test,1,0.9)] 
results += [test[r] for r in difflib.get_close_matches(s2.lower(),test,1,0.9)] 
print results 

Đầu ra:

['Acacia kochii W.Fitzg.', 'Acacia kochii W.Fitzg.'] 
+0

Xin lỗi để khởi động lại một bài đăng cũ, nhưng tôi thấy điều này thú vị. Đối với sản phẩm tìm kiếm cuối cùng, tôi đang đọc mã và có vẻ như bạn sẽ không cần danh sách kết quả đầu tiên và s1. Đúng không? Có vẻ như thuật toán sẽ tạo ra kết quả bạn muốn mà không có những dòng đó. –

+0

@TylerRussell đúng. Mục đích là để xác minh rằng viết hoa của cụm từ tìm kiếm không ảnh hưởng đến kết quả. Thực tế là tìm kiếm với s1 và tìm kiếm với s2 tạo ra kết quả tương tự cho thấy rằng thuật toán đã làm việc. Nói chung, bạn sẽ chỉ sử dụng một cụm từ tìm kiếm. – rudivonstaden

Trả lời

7

Tôi không thấy bất kỳ cách nhanh nào để so sánh không phân biệt chữ hoa chữ thường.

Các giải pháp nhanh chóng-và-bẩn có vẻ là

  • làm một chức năng có thể chuyển đổi chuỗi đối với một số hình thức kinh điển (ví dụ: chữ in hoa, đơn khoảng cách đều nhau, không có dấu chấm câu)

  • sử dụng chức năng để thực hiện một dict của {string kinh điển: string gốc} và một danh sách các [chuỗi kinh điển]

  • .get_close_matches chạy chống lại danh sách kinh điển-chuỗi, sau đó cắm kết quả thông qua các dict để có được nguồn gốc al strings back

+0

Cảm ơn. Nó không thanh lịch, nhưng nó hoạt động! – rudivonstaden

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