2015-07-10 5 views
0

Я пытаюсь сравнить текст с заранее составленным списком слов, в частности, производителей автомобилей. Проблема в том, что текст, который я сравниваю, написан людьми и не всегда надежный.Частичное соответствие строк с Python

Например, я хочу найти «Harley Davidson», но в тексте на самом деле говорится «Hardley Davidson» или какая-то другая неосторожная опечатка.

Я не думаю, что могу использовать регулярное выражение для решения этой проблемы ... или я могу? Есть ли частичная функция сопоставления строк? Возможно, я мог бы определить процент строки, которая должна соответствовать.

+0

Попробуйте fuzzy wuzzy – The6thSense

+0

http://streamhacker.com/2011/10/31/fuzzy-st ring-matching-python/вы должны найти nltk полезным –

+0

Это похоже на хороший вариант. Не видел этого раньше. Попытка сейчас. –

ответ

0

Вы можете использовать fuzzywuzzy модуль

from fuzzywuzzy import fuzz 
fuzz.partial_ratio("Harley Davidson","Hardley Davidson") 
93 

Для более нечеткой WuZZy и это способ попробовать этот link

+0

Выглядит хорошо. У вас есть достаточный опыт работы с ним, чтобы знать достойное соотношение для использования в качестве порога? Вероятно, 75% - это то, с чего я начну. –

+0

@WilliamKeidel есть много методов, которые видят вторую ссылку и выбирают подходящий метод, а затем думают о пороге – The6thSense

0

Это называется расстояние редактирования: https://en.wikipedia.org/wiki/Edit_distance Вы можете сделать это с помощью NLTK или Levensthein https://pypi.python.org/pypi/python-Levenshtein/

Вот пример использования Levenshtein (который быстрее, чем функция nltk edit_distance), сначала у вас установлена ​​тонна библиотека (ссылка прилагается):

# -*- coding:utf-8 -*- 
import Levenshtein 

mylist = ["harley davidson", "kawazaki"] 

for element in mylist: 
    if Levenshtein.distance(element.lower(), "Hardley Davidson".lower()) == 1: 
     print("same word with mispelling") 

КСТАТИ:

  • я опустил случай все здесь вы можете это сделать или нет

  • вы можете, но на большее расстояние, чем один, если mispellings являются кратные

Смежные вопросы