Удаление стоп-слова с помощью NLTK

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

  • AttributeError: объект 'unicode' не имеет атрибута '_sa_instance_state'
  • Как использовать can_add_related в Django Admin
  • Запросить флажок в файле request.form
  • Вложенные действия try в python?
  • Как использовать подпроцессы, чтобы заставить python выпускать память?
  • Расчет расстояния AP, включая отношение сигнал / шум
  • Как отправить запрос POST как JSON?
  • Почему super () разбит на Python-2.x?
  • 4 Solutions collect form web for “Удаление стоп-слова с помощью NLTK”

    Я предлагаю вам создать собственный список слов-операторов, которые вы выберете из списка. Наборы можно удобно вычесть, поэтому:

    operators = set(('and', 'or', 'not')) stop = set(stopwords...) - operators 

    Затем вы можете просто проверить, включено ли слово in набор или not in не полагаясь на то, являются ли ваши операторы частью списка. Затем вы можете переключиться на другой список или добавить оператора.

     if word.lower() not in stop: # use word 

    В NLTK встроенный список стоп-слов, составленный из 2400 стоп-слов на 11 языках (Porter et al), см. http://nltk.org/book/ch02.html

     >>> from nltk import word_tokenize >>> from nltk.corpus import stopwords >>> stop = set(stopwords.words('english')) >>> sentence = "this is a foo bar sentence" >>> print [i for i in sentence.lower().split() if i not in stop] ['foo', 'bar', 'sentence'] >>> [i for i in word_tokenize(sentence.lower()) if i not in stop] ['foo', 'bar', 'sentence'] 

    Я рекомендую посмотреть на использование tf-idf для удаления стоп-слов, см. « Влияние Stemming» на частоту термина?

    Ответ @ alvas выполняет эту работу, но это можно сделать быстрее. Предполагая, что у вас есть documents : список строк.

     from nltk.corpus import stopwords from nltk.tokenize import wordpunct_tokenize stop_words = set(stopwords.words('english')) stop_words.update(['.', ',', '"', "'", '?', '!', ':', ';', '(', ')', '[', ']', '{', '}']) # remove it if you need punctuation for doc in documents: list_of_words = [i.lower() for i in wordpunct_tokenize(doc) if i.lower() not in stop_words] 

    Обратите внимание, что из-за того, что здесь вы ищете в наборе (не в списке), скорость будет теоретически len(stop_words)/2 раза быстрее, что существенно, если вам нужно работать через многие документы.

    Для 5000 документов размером около 300 слов разница составляет 1,8 секунды для моего примера и 20 секунд для @ alvas.

    PS в большинстве случаев вам нужно разделить текст на слова, чтобы выполнить некоторые другие задачи классификации, для которых используется tf-idf. Поэтому, скорее всего, было бы лучше использовать и стеблем:

     from nltk.stem.porter import PorterStemmer porter = PorterStemmer() 

    и использовать [porter.stem(i.lower()) for i in wordpunct_tokenize(doc) if i.lower() not in stop_words] внутри цикла.

    @alvas имеет хороший ответ. Но опять же это зависит от характера задачи, например, в вашем приложении вы хотите рассмотреть все conjunction например, и, или, если, хотя и все determiner например , a, some, most, every, no as stop words учитывая, что все остальные части речи являются законными, тогда вы можете захотеть изучить это решение, в котором используется фрагмент речи, чтобы отбросить слова, проверите таблицу 5.1 :

     import nltk STOP_TYPES = ['DET', 'CNJ'] text = "some data here " tokens = nltk.pos_tag(nltk.word_tokenize(text)) good_words = [w for w, wtype in tokens if wtype not in STOP_TYPES] 
    Interesting Posts

    Асинхронный процесс Python работает синхронно

    Отправка формы Django в модуле Bootstrap Modal

    Обучение регистрации и проверка достоверности в тензокартоне

    Изменение кодировки Windows cmd вызывает сбой Python

    Добавление поля в структурированный массив numpy

    Есть ли лучший способ хранить словарь twoway, чем хранить его обратный отдельный?

    Суммирование на многоиндексном уровне в серии панд

    Копирование содержимого переменной в буфер обмена

    масштабирование чисел по столбцу с помощью pandas

    Matplotlib перетаскивает точки перекрытия в интерактивном режиме

    Как преобразовать мой базовый код TensorFlow на основе подачи, чтобы использовать «Набор данных»?

    Проблемы с pip install numpy – RuntimeError: Broken toolchain: невозможно связать простую программу C

    Многопроцессорность Python: как я могу делиться между несколькими процессами?

    Как обрабатывать utf8 в командной строке (используя Perl или Python)?

    pip не может правильно установить пакеты: Permission denied error

    Python - лучший язык программирования в мире.