Я ищу библиотеку или метод с использованием существующих библиотек (difflib
, fuzzywuzzy
, python-levenshtein
), чтобы найти самое близкое соответствие строки (query
) в тексте (corpus
)
Я разработал метод, основанный на difflib
, где я разбил свой corpus
на ngrams размером n
(длина query
).
import difflib
from nltk.util import ngrams
def get_best_match(query, corpus):
ngs = ngrams( list(corpus), len(query) )
ngrams_text = [''.join(x) for x in ngs]
return difflib.get_close_matches(query, ngrams_text, n=1, cutoff=0)
он работает так, как я хочу, когда разница между запросом и совпадающей строкой - это просто замена символов.
query = "ipsum dolor"
corpus = "lorem 1psum d0l0r sit amet"
match = get_best_match(query, corpus)
# match = "1psum d0l0r"
Но когда разница - это удаление символа, это не так.
query = "ipsum dolor"
corpus = "lorem 1psum dlr sit amet"
match = get_best_match(query, corpus)
# match = "psum dlr si"
# expected_match = "1psum dlr"
Есть ли способ получить более гибкий размер результата (как для expected_match
)?
РЕДАКТИРОВАТЬ 1:
- Фактическое использование этого script заключается в совпадении запросов (строк) с грязный выход ocr.
- Как я уже сказал в вопросе, ocr может смешивать символы и даже пропускать их.
- Если возможно, рассмотрите также случай, когда пробел отсутствует между словами.
- Наилучшее совпадение - это тот, который не включает символы из других слов, чем те, что указаны в запросе.
ИЗМЕНИТЬ 2:
Решение, которое я использую сейчас, - это расширить ngrams с помощью (n-k)-grams for k = {1,2,3}
, чтобы предотвратить 3 удаления. Это намного лучше, чем первая версия, но неэффективна с точки зрения скорости, поскольку мы имеем более чем в 3 раза больше числа ngrams для проверки. Это также не обобщаемое решение.