2011-12-15 35 views
5

Tôi phải viết một hàm lấy chuỗi làm đối số và kết hợp chuỗi này thành hai chuỗi khác và trả về chuỗi tương tự nhất và số khác biệt.so sánh hai chuỗi và trả về một chuỗi tương tự nhất

def func("LUMB"): 
    lst=["JIBM", "NUNE", "NUMB"] 
should return: 
("NUMB",1) 

Tôi đã thử:

def f(word): 
    lst=["JIBM", "NUNE", "NUMB"] 
    for i in lst: 
     d=k(word, lst) 
     return differences 
     for n in d: 
      print min(sum(n)) 

nơi:

def k(word1, word2): 
    L=[] 
    for w in range(len(word1)): 
     if word1[w] != word2[w]: 
      L.append(1) 
     else: 
      L.append(0) 
    return L 

để tôi có được một danh sách các ví dụ, [1,0,0,0] nếu word1 = "tê liệt "và word2 =" LUMB "

+3

Bạn đã thấy [Thuật toán sai biệt văn bản] (http://stackoverflow.com/questions/145607/text-difference-algorithm) và [Mô-đun Python tốt cho so sánh chuỗi mờ] (http://stackoverflow.com/questions)/682367/good-python-modules-for-fuzzy-string-so sánh) – Chris

+0

Một số câu trả lời sẽ có sẵn trên liên kết này quá http://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy -string-comparison –

+0

Trên trang web có một bài tương tự. Bạn sẽ nhận được một số câu trả lời có giá trị hơn ở đây http://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison –

Trả lời

10

Có vẻ như Shawn Chin đã cung cấp giải pháp tốt nhất, nhưng nếu bạn bị ngăn cản sử dụng các mô-đun không được xây dựng, có vẻ như get_close_matches từ difflib có thể giúp:

import difflib 
difflib.get_close_matches("LUMB", ["JIBM", "NUNE", "NUMB"], 1) 

Số chênh lệch có thể được nhận bằng cách sử dụng phương pháp get_opcodes của SequenceMatcher và làm việc với giá trị trả về của nó.

+0

Trong khi điều này không trả về khoảng cách chỉnh sửa, tôi thích nó chỉ sử dụng thư viện chuẩn. +1 –

6

Sử dụng pylevenshtein để tính toán Levenshtein distance:

>>> from Levenshtein import distance 
>>> from operator import itemgetter 
>>> lst = ["JIBM", "NUNE", "NUMB"] 
>>> min([(x, distance("LUMB", x)) for x in lst], key=itemgetter(1)) 
('NUMB', 1) 

Hoặc, như một hàm:

from Levenshtein import distance 
from operator import itemgetter 
def closest(word, lst): 
    return min([(x, distance(word, x)) for x in lst], key=itemgetter(1)) 

print closest("NUMB", ["JIBM", "NUNE", "NUMB"]) 

tái bút: Nếu bạn muốn tránh phụ thuộc bổ sung, bạn luôn có thể thực hiện chức năng của riêng bạn để tính toán khoảng cách. Ví dụ, một số phiên bản được đề xuất trong wikibooks mỗi phiên bản có ưu và nhược điểm riêng của chúng.

Tuy nhiên, nếu hiệu suất là một mối quan tâm, hãy cân nhắc gắn bó với các mô-đun được tạo tùy chỉnh. Ngoài số pylevenshtein, cũng có python-levenshteinnltk.metrics.distance (nếu bạn đã sử dụng NLTK).

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