词干过程不适用于Python

时间:2016-04-01 11:01:27

标签: python stemming

我有一个文本文件,我在删除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年中,不断出现周期性上涨,繁荣萧条的行业。我预测接下来会发生。有一段时间担心不确定性拼字游戏找到一些东西让当地经济浮油不见了。然后好转看到就业投资油,大家呼吸叹息救援多元化回归燃烧器。那次垮台。主要行业容易崩溃。看看这个国家已经废弃的造船厂已经灭绝的煤钢工业。这个至关重要的恐慌性衰退,开始计划明智的未来。我们的公民商业领袖需要不断寻求安全繁荣 - 旅游,技术,生物科学新兴产业。我们需要经济上强大的相当等待看到油轮过山车碰到缓冲区。 N JonesEllon

代码的第一部分工作正常(删除停用词和标记化),但我们第二部分(Stem)不起作用。知道为什么吗?

2 个答案:

答案 0 :(得分:3)

在Stemmer docs http://www.nltk.org/howto/stem.html中,看起来Stemmer被设计为一次只调用一个单词。

尝试在

中的每个单词上运行它
[word for word in data0 if word not in (stopwords.words('english'))]

即。在调用join之前

E.g。

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

我不认为有一个可以直接应用于文本的词干分析器,但是你可以将它包装在你自己的功能中,这需要&#39; ps&#39;和文字:

def my_stem(text, stemmer):
    words = text.split(" ")
    stemmed_words = map(stemmer, words)
    result = " ".join(list(stemmed_words))
    return result

答案 1 :(得分:1)

这是我过去用NLTK做过的事情:

st = PorterStemmer()

def stem_tokens(tokens):
    for item in tokens:
        yield st.stem(item)

def go(text):
    tokens = nltk.word_tokenize(text)

    return ' '.join(stem_tokens(tokens))