Как уже упоминалось, 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;
Я предлагаю вам создать свой собственный список слов-операторов, которые вы выберете из списка. Наборы можно удобно вычесть, поэтому:
operators = set(('and', 'or', 'not'))
stop = set(stopwords...) - operators
Затем вы можете просто проверить, есть ли слово in
или not in
набор, не полагаясь на то, являются ли ваши операторы частью списка. Затем вы можете переключиться на другой список или добавить оператора.
if word.lower() not in stop:
# use word
В 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 на частоту?
@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]
Ответ @ 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]
внутри цикла.
Вы можете использовать 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