NLTK: слово & ldquo; a & rdquo; не удаляться как секундомер [дубликат]

Как уже упоминалось, Apache Commons NumberUtils может это сделать. Какой возврат 0, если он не может преобразовать строку в int.

Вы также можете определить свое собственное значение по умолчанию.

NumberUtils.toInt(String str, int defaultValue)

example:

NumberUtils.toInt("3244", 1) = 3244
NumberUtils.toInt("", 1)     = 1
NumberUtils.toInt(null, 5)   = 5
NumberUtils.toInt("Hi", 6)   = 6
NumberUtils.toInt(" 32 ", 1) = 1 //space in numbers are not allowed
NumberUtils.toInt(StringUtils.trimToEmpty( "  32 ",1)) = 32; 
60
задан alvas 2 October 2013 в 09:46
поделиться

5 ответов

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

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

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

if word.lower() not in stop:
    # use word
57
ответ дан otus 31 August 2018 в 18:21
поделиться

В NLTK имеется встроенный список стоп-слов, состоящий из 2400 стоп-слов для 11 языков (Porter и др.), см. 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 на частоту?

127
ответ дан Johan 31 August 2018 в 18:21
поделиться

@alvas имеет хороший ответ. Но опять же это зависит от характера задачи, например, в вашем приложении вы хотите рассмотреть все conjunction, например. и, или, но, если, хотя и все determiner, например. the, a, some, most, every, no в качестве стоп-слов, считающих все остальные части речи законными, тогда вы можете захотеть изучить это решение, в котором использование фрагментарных тегов для отбрасывания слов , Контрольная таблица 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]
9
ответ дан kmario23 31 August 2018 в 18:21
поделиться

Ответ @ 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] внутри цикла.

26
ответ дан Salvador Dali 31 August 2018 в 18:21
поделиться

Вы можете использовать string.punctuation со встроенным списком стоп-слов NLTK:

from nltk.tokenize import word_tokenize, sent_tokenize
from nltk.corpus import stopwords
from string import punctuation

words = tokenize(text)
wordsWOStopwords = removeStopWords(words)

def tokenize(text):
        sents = sent_tokenize(text)
        return [word_tokenize(sent) for sent in sents]

def removeStopWords(words):
        customStopWords = set(stopwords.words('english')+list(punctuation))
        return [word for word in words if word not in customStopWords]

Завершить полные блокировки NLTK list

1
ответ дан UsmanZ 31 August 2018 в 18:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: