Подтвердить что ты не робот

Техника удаления общих слов (и их множественных версий) из строки

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

Как вы считаете, самый эффективный способ удалить общие слова из списка тегов?

Другими словами, я имею в виду такие слова, как "the", "at", "there", "the" и т.д.

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

Методология 1:
- Определите количество раз, когда происходит каждое слово (с использованием библиотечных коллекций)
- Имейте список общих слов и удалите все "Обычные слова" из объекта "Коллекция", пытаясь удалить этот ключ из объекта "Коллекция", если он существует.
- Следовательно, скорость будет определяться длиной переменной 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:
- Для общеупотребительных слов, которые могут быть множественными, посмотрите на каждое слово в строке рецепта и проверьте, содержит ли он частично не множественную версию общего слова. Например; Для строки "There the test" проверьте каждое слово, чтобы увидеть, содержит ли оно "там" и удалит его, если это произойдет.

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()
4b9b3361

Ответ 1

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

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 stopwords:

'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'

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

Ответ 2

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

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

Учитывая, что NLP является одной из самых сложных тем в информатике, изобретать это колесо - это много работы...

Ответ 3

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

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