Сравните строку с названием бренда и удалите орфографические ошибки

У меня есть список текстов, содержащих названия брендов (Coca-Cola, Pepsi, 7Up и т. д.). Я написал скрипт на Python, который сортирует и подсчитывает все ячейки с одинаковым содержимым (тот же самый текст, после всего текста в нижнем регистре) и переупорядочивает список по количеству каждого текста, так что тексты, которые появляются больше всего, будут первыми, потому что я предполагаю, что большинство людей напишет название бренда правильно. Например, если у меня есть следующий список:

texts = ['Coca-Cola', 'Pepsi', 'Coca-Cola', 'Coca-Cola', 'Pepsi', 'Pespi', 'Pepsi', '7Up', '7up', 'Cola', 'Pepsi']

После первого шага список будет таким:

ordered_text = [
   {'text': 'Pepsi', count: 4},
   {'text': 'Coca-Cola', count: 3},
   {'text': '7Up', count: 2},
   {'text': 'Cola', count: 1},
   {'text': 'Pespi', count: 1},
]  

На втором этапе я использую пакет ngram, чтобы попытаться сопоставить более близкие тексты, чтобы исправить за орфографические ошибки. Важное примечание: один из моих ключевых запросов — иметь решение, не зависящее от языка.

Моя проблема в том, что NGRAM очень хорошо работает с длинным текстом, но плохо работает с коротким текстом. Например, при запуске:

ngram.NGram.compare('Pepsi', 'Pespi')

результат будет:

0.2727272727272727

Это очень низкая «оценка», но, как вы можете видеть, строка очень близка, и только 1 буква неуместна.

Что я могу сделать, чтобы улучшить свое отвращение? Нужно ли использовать другой алгоритм? Или, может быть, указать другие параметры для этого теста? Я подумал о том, чтобы добавить словарь, содержащий все «новые» слова, которые я нашел, добавить их, затем я могу сравнить каждое слово с ним, но тогда я теряю детализацию сценария.


person shlomiLan    schedule 20.11.2016    source источник
comment
Для опечаток, сработает ли расстояние Левенштейна?   -  person aufziehvogel    schedule 20.11.2016
comment
Возможно, низкий = хороший? Во всяком случае, лично я предпочитаю использовать расстояние Левенштейна для проверки орфографии. Например, LD неправильного и неправильного размещения составляет 2. Разделив на длину слова, получится 2/9, что довольно близко.   -  person Jongware    schedule 20.11.2016
comment
В «NGRAM» вы хотите, чтобы оценка была как можно ближе к 1, это означает, что строки идентичны. В общем, как вы думаете, будет ли лучше запустить алгоритм NGRAM, и если он не найдет совпадений, попытаться запустить расстояние Левенштейна или просто использовать расстояние Левенштейна в этом случае?   -  person shlomiLan    schedule 20.11.2016


Ответы (1)


Из вашего вопроса не очевидно, хотите ли вы проверить правильность ввода или просто хотите сгруппировать их. Например, если ваш ввод выглядит как ['coka-cola', 'coak-cola', 'coca-coca'], что должен делать ваш алгоритм?

  • Должен ли он сгруппировать их всех как {'coka-cola': 3}? Значение всегда сравнивать входные данные с первым вхождением? В этом случае редактирование расстояния имеет смысл, вы можете легко найти множество реализаций Python для этого.

  • Должен ли он группировать их по правильному написанию, так что {'coka-cola': 3}? В этом случае вам нужен хороший корректор орфографии. Здесь есть несколько вариантов, вы можете взглянуть на пакет autocorrect , или более сложное решение — пакет NLTK. Другой вариант — использовать Google. Я не думаю, что у Google есть поддерживаемый API для исправления правописания, поэтому вам придется выполнить некоторую очистку, чтобы получить предлагаемые результаты при отправке запроса в Google.

person yelsayed    schedule 20.11.2016
comment
Конечным результатом алгоритма должны быть все тексты, которые одинаково сгруппированы вместе, в вашем примере: [{'coka-cola': 2}, {''coca-coca': 1}], потому что первая и вторая строки похожи, а третья менее похожа. это имеет смысл? - person shlomiLan; 20.11.2016
comment
Непонятно, почему вы думаете, что «кока-кола» и «коак-кола» больше похожи друг на друга, чем на «кока-коку». Например, если вы используете расстояние редактирования, все они будут находиться на расстоянии не более двух правок друг от друга, что является очень низким порогом редактирования. - person yelsayed; 20.11.2016