Задать вопрос
@Bjornie
Изучаю Python

Как наиболее точно сравнить две строки?

Есть строка (комплектация) A 170 Classic - 7/2004 - 85Kw, которую надо выбрать из результатов поиска, в котором есть такие строки:

A 170 CDI CAT CLASSIC
A 170 CDI CAT ELEGANCE
A 170 CDI CAT AVANTGARDE

Из первой строки меня интересует только A 170 Classic. Но я не могу ее сравнить точно со 2-й строкой, т.к. в ней посередине присутствует CDI CAT.

У меня уже получалось 100% точно выбирать нужную комплектацию, когда в переменных были хотя бы CV и Kw. Но в данный момент их нет.

Таких вариаций может быть очень много и хотелось бы понять как наиболее точно их сравнивать.
  • Вопрос задан
  • 1122 просмотра
Подписаться 7 Простой 4 комментария
Решения вопроса 1
adugin
@adugin Куратор тега Python
Пример решения с использованием стандартной библиотеки difflib:
from difflib import get_close_matches as gcm

model = 'A 170 Classic - 7/2004 - 85Kw'.upper()
model_list = map(str.upper, [
    'A 170 CDI CAT ELEGANCE',
    'A 170 CDI CAT CLASSIC',
    'A 170 CDI CAT AVANTGARDE',
])

result = gcm(model, model_list, n=1, cutoff=0.5)[0]

print(result)  # => 'A 170 CDI CAT CLASSIC'

Также посмотрите в сторону difflib.SequenceMatcher().ratio(), это имеет прямое отношение к cutoff в примере выше:
from difflib import SequenceMatcher as SM

s1 = 'A 170 Classic - 7/2004 - 85Kw'.upper()
s2 = 'A 170 CDI CAT CLASSIC'.upper()

SM(isjunk=None, a=s1, b=s2, autojunk=True).ratio()  # => 0.52

Теория: Расстояние Левенштейна
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Ух, как я подразумеваю, вам нужен полнотекстовый поиск, так вам сюда -elasticsearch.com
сюда - elasticsearch-dsl.readthedocs.io/en/latest
и сюда - https://elasticsearch-py.readthedocs.io/en/master/

Другими словами,
1) ставите Elasticsearch
2) заливатете в него свои данные
3) ищете их из питона через ES python client API и ES python DSL

Получаете скилов и профит в быстром поиске.

PS. Если чо - обращайтесь.

PPS. Есть второй путь - сделать свой "обратный" индекс термов, где набору термов соответствуют ID документов, но это долго, нужно, муторно и дорого.
Ответ написан
@Hrabryi
str1 = "A 170 Classic - 7/2004 - 85Kw".upper().split(' ') # не забываем привести к одному регистру

text = ['A 170 CDI CAT CLASSIC', '123']

search_words = [str1[0], str1[1], str1[2]] # Задаем ключевые слова для поиска

for sentence in text:
    for word in search_words:
        if word not in sentence:
            break
    else:
        print(sentence)
Ответ написан
Комментировать
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Легковесная альтернатива Elasticsearch sphinxsearch.com
sphinx умеет притворяться mysql ранних версий, поэтому можно брать любую python либу для подключения к mysql.
Туторы на православном chakrygin.ru/search/label/Sphinx немного устарели, но лучше не найти.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы