Техника удаления общих слов (и их множественного числа) из строки - PullRequest
15 голосов
/ 31 марта 2012

Я пытаюсь найти теги (ключевые слова) для рецепта, анализируя длинную строку текста.В тексте содержатся ингредиенты рецепта, указания и краткая реклама.

Какой, по вашему мнению, самый эффективный способ удаления распространенных слов из списка тегов?

Под общими словами я подразумеваю такие слова, как: '', 'в', 'там', 'их' и т. Д.

У меня есть 2 методологии, которые я могу использовать, как вы думаете,является более эффективным с точки зрения скорости, и знаете ли вы о более эффективном способе, которым я мог бы сделать это?

Методология 1:
- Определить, сколько раз каждое слово встречается (с использованием библиотеки Collections)
- Иметь список общих слов и удалить все «Общие слова» из объекта Collection, пытаясь удалить этот ключ из объекта Collection, если он существует.
- Следовательно, скорость будет определяться длиной переменных delims

import collections from Counter
delim     = ['there','there\'s','theres','they','they\'re'] 
# the above will end up being a really long list!
word_freq = Counter(recipe_str.lower().split())
for delim in set(delims):
    del word_freq[delim]
return freq.most_common()

Методология 2:
- Для общих слов, которые могут быть множественным числом, посмотрите на каждое слово в строке рецепта и проверьте, содержит ли оно частично не-множественную версию общего слова.Например;Для строки «Есть тест» проверьте каждое слово, чтобы увидеть, содержит ли оно «там», и удалите его, если оно есть.

delim         = ['this','at','them'] # words that cant be plural
partial_delim = ['there','they',] # words that could occur in many forms
word_freq     = Counter(recipe_str.lower().split())
for delim in set(delims):
    del word_freq[delim]
# really slow 
for delim in set(partial_delims):
    for word in word_freq:
        if word.find(delim) != -1:
           del word_freq[delim]
return freq.most_common()

Ответы [ 3 ]

26 голосов
/ 08 апреля 2012

Я бы просто сделал что-то вроде этого:

from nltk.corpus import stopwords
s=set(stopwords.words('english'))

txt="a long string of text about him and her"
print filter(lambda w: not w in s,txt.split())

, который печатает

['long', 'string', 'text']

и по сложности должен быть O (n) по количеству слов в строке, если вы считаете, что поиск хэшированного набора равен O (1).

FWIW, моя версия NLTK определяет 127 стоп-слов :

'all', 'just', 'being', 'over', 'both', 'through', 'yourselves', 'its', 'before', 'herself', 'had', 'should', 'to', 'only', 'under', 'ours', 'has', 'do', 'them', 'his', 'very', 'they', 'not', 'during', 'now', 'him', 'nor', 'did', 'this', 'she', 'each', 'further', 'where', 'few', 'because', 'doing', 'some', 'are', 'our', 'ourselves', 'out', 'what', 'for', 'while', 'does', 'above', 'between', 't', 'be', 'we', 'who', 'were', 'here', 'hers', 'by', 'on', 'about', 'of', 'against', 's', 'or', 'own', 'into', 'yourself', 'down', 'your', 'from', 'her', 'their', 'there', 'been', 'whom', 'too', 'themselves', 'was', 'until', 'more', 'himself', 'that', 'but', 'don', 'with', 'than', 'those', 'he', 'me', 'myself', 'these', 'up', 'will', 'below', 'can', 'theirs', 'my', 'and', 'then', 'is', 'am', 'it', 'an', 'as', 'itself', 'at', 'have', 'in', 'any', 'if', 'again', 'no', 'when', 'same', 'how', 'other', 'which', 'you', 'after', 'most', 'such', 'why', 'a', 'off', 'i', 'yours', 'so', 'the', 'having', 'once'

, очевидно, вы можете предоставить свойсобственный набор;Я согласен с комментарием на ваш вопрос о том, что, вероятно, проще (и быстрее) просто предоставить все варианты, которые вы хотите исключить заранее, если вы не хотите исключить намного больше слов, чем это, но тогда это становится больше вопросомобнаружение интересных, чем устранение ложных.

10 голосов
/ 31 марта 2012

Ваш проблемный домен: " Обработка естественного языка ".

Если вы не хотите изобретать велосипед, используйте NLTK , найдите

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Это одна из самых сложных задач в области компьютерных наук, поэтому изобретать это колесо - большая работа ...

1 голос
/ 08 апреля 2012

Вы спрашиваете о скорости, но вам следует больше беспокоиться о точности.Оба ваших предложения сделают много ошибок, удалив либо слишком много, либо слишком мало (например, есть много слов, которые содержат подстроку "at").Второе предложение - заглянуть в модуль nltk.Фактически, один из ранних примеров в книге NLTK включает удаление общих слов, пока самые распространенные из оставшихся не раскрывают что-то о жанре.Вы получите не только инструменты, но и инструкцию, как это сделать.

В любом случае, вы будете тратить гораздо больше времени на написание вашей программы, чем ваш компьютер потратит ее выполнение, поэтому сосредоточьтесь на том, чтобы делать это хорошо.

...