заставляя difflib's SequenceMatcher игнорировать "мусорные" символы - PullRequest
5 голосов
/ 03 апреля 2012

У меня много строк, которые я хочу сопоставить по сходству (каждая строка в среднем состоит из 30 символов). Я нашел difflib's SequenceMatcher отлично подходит для этой задачи, так как это было просто и нашел хорошие результаты. Но если я сравню hellboy и hell-boy вот так

>>> sm=SequenceMatcher(lambda x:x=='-','hellboy','hell-boy')
>>> sm.ratio()
0: 0.93333333333333335

Я хочу, чтобы такие слова соответствовали 100%, т. Е. ratio of 1.0. Я понимаю, что символ барахла, указанный в функции выше, не используется для сравнения, но находит самую длинную непрерывную совпадающую подпоследовательность. Есть ли способ заставить SequenceMatcher игнорировать некоторые "ненужные" символы для сравнения ?

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

Если вы хотите сделать, как я предложил в комментариях, (удаляя символы junk ), самый быстрый способ - использовать str.translate().

например:

to_compare = to_compare.translate(None, {"-"})

Как показано здесь , это значительно (в 3 раза) быстрее (и мне приятнее читать), чем регулярное выражение.

Обратите внимание, что в Python 3.x или если вы используете Unicode в Python 2.x, это не будет работать, так как параметр delchars не принят. В этом случае вам просто нужно сопоставить None. Например:

translation_map = str.maketrans({"-": None})
to_compare = to_compare.translate(translation_map)

У вас также может быть небольшая функция для сохранения набора текста, если у вас есть много символов, которые вы хотите удалить, просто сделайте набор и пройдите:

def to_translation_map(iterable):
    return {key: None for key in iterable}
    #return dict((key, None) for key in iterable) #For old versions of Python without dict comps.
1 голос
/ 03 апреля 2012

Если бы вам нужно было сделать функцию, чтобы удалить все ненужные символы перед рукой, вы могли бы использовать re:

string=re.sub('-|_|\*','',string)

для регулярного выражения '-|_|\*' просто поставьте | между всеми ненужными символами и, если это специальный повторный символ, поставьте перед ним \ (например, * и +)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...