我有一个在删除stem后试图stopwords的文本文件,但运行时似乎没有任何更改。我的文件名为data0
以下是我的代码:

## Removing stopwords and tokenizing by words (split each word)
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

data0 = word_tokenize(data0)
data0 = ' '.join([word for word in data0 if word not in (stopwords.words('english'))])
print(data0)

## Stemming the data
from nltk.stem import PorterStemmer

ps = PorterStemmer()
data0 = ps.stem(data0)
print(data0)

我得到了以下信息(为了便于阅读):
对于我们阿伯丁周围的人来说,要问“什么石油工业(10月26日晚间快报)触摸似曾相识。这个问题几乎是从第一天开始就被提出来的。在过去的30年里,经济周期不断地起伏,繁荣使工业萧条。我预测接下来会发生。有一段时间担心不确定性,拼凑出一些东西让当地经济活跃的石油消失了。然后上升看就业投资石油,大家松口气寻求多元化走回头路。那次垮台主要行业容易崩溃。看看这个国家已经倒闭的造船厂,煤炭钢铁工业已经绝迹这是至关重要的,不要惊慌失措,开始明智地规划未来我们的公民商业领袖需要不断寻找安全繁荣的东西——旅游业、科技、生物科学新兴产业我们需要经济实力,而不是等待石油过山车撞上缓冲器。琼斯龙
代码的第一部分工作正常(删除停止字和标记化),但我们的第二部分(Stem)不工作知道为什么吗?

最佳答案

从词干分析器文档来看,词干分析器设计为一次调用一个单词。
试着把每个字都写进去

[word for word in data0 if word not in (stopwords.words('english'))]

即在呼叫加入之前
例如。
stemmed_list = []
for str in [word for word in data0 if word not in (stopwords.words('english'))]:
    stemmed_list.append(ps.stem(str))

编辑:评论回复。
我做了下面的测试,结果似乎正确无误:
>>> from nltk.stem import PorterStemmer
>>> ps = PorterStemmer()
>>> data0 = '''<Your Data0 string>'''
>>> words = data0.split(" ")
>>> stemmed_words = map(ps.stem, words)
>>> print(list(stemmed_words))  # list cast needed because of 'map'
[..., 'industri', ..., 'diversifi']

我不认为有一个词干分析器可以直接应用于文本,但是您可以用自己的函数将它包装起来,该函数接受“ps”和文本:
def my_stem(text, stemmer):
    words = text.split(" ")
    stemmed_words = map(stemmer, words)
    result = " ".join(list(stemmed_words))
    return result

10-06 10:48