2016-11-20 3 views
1

У меня есть список текстов, содержащих торговые марки (Coca-Cola, Pepsi, 7Up ect.). Я написал скрипт 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

Для опечаток было бы [levenshtein distance] (https://en.wikipedia.org/wiki/Levenshtein_distance) работать? – Aufziehvogel

+0

Возможно, «низкий = хороший»? Во всяком случае, лично я предпочитаю использовать расстояние Левенштейна для проверки орфографии. Например, LD «missplaed» против «misplaced» - «2». Разделение на длину слова составляет 2/9, что довольно близко. – usr2564301

+0

В «NGRAM» вы хотите, чтобы оценка была как можно ближе к 1, это означает, что строки идентичны. Я вообще думаю, что лучше всего запустить алгоритм NGRAM, и если бы он не нашел совпадения, чтобы попытаться запустить расстояние levenshtein или просто использовать расстояние levenshtein в этом случае? –

ответ

1

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

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

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

+0

Конечным результатом алгоритма должны быть все тексты, которые сгруппированы вместе, в том числе: '[{'coka-cola': 2}, {'' coca-coca ': 1}]', потому что первый и второй строки похожи, а третий меньше. это смысл? –

+0

Непонятно, почему вы думаете, что «кока-кола» и «кока-кола» наиболее похожи друг на друга, чем на «кока-кока». Например, если вы используете дистанцию ​​редактирования, все они будут иметь максимум два изменения друг от друга, что является очень низким порогом редактирования. – yelsayed

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