要删除文本文件中的停用词而不删除空格

时间:2015-02-11 03:56:37

标签: python-2.7 nltk stop-words

我必须从包含50K推文的文本文件中删除停用词。当我运行此代码时,它成功删除了停用词,但同时也删除了空格。我希望文本中有空格。

from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
import codecs

import nltk

stopset = set(stopwords.words('english'))

writeFile = codecs.open("outputfile", "w", encoding='utf-8')

with codecs.open("inputfile", "r", encoding='utf-8') as f:
           line = f.read()
           tokens = nltk.word_tokenize(line)
           tokens = [w for w in tokens if not w in stopset]
           for token in tokens:
               writeFile.write(token)

1 个答案:

答案 0 :(得分:1)

编写时,在空白处写入空格。在您的具体情况下,每个令牌之后的换行符似乎是合适的,因为您已经杀死所有其他格式。使用print代替write可以做到这一点,而无需您使用明确的换行标记:

from __future__ import print_function  # if you're on Python 2
# ...
for token in tokens:
    print(token, file=writeFile)

或者,如果您想要空格而不是换行符,请添加空格。 如果您的令牌数量有限,您可以

print(' '.join(tokens), file=writeFile)

但是这会占用大量的内存来在打印之前将字符串连接在一起,因此在令牌上循环会更经济。但是因为你一次处理一行,所以加入可能已经足够好了,并且可以在一条输出线上从一条输入线获得令牌。

如果每行有大量的令牌,并希望循环它们以提高内存效率,一个常见的习惯用法是声明一个最初为空的分隔符:

sep = ''
for token in tokens:
    writeFile.write('{}{}'.format(sep, token))  # str.format(): py >= 2.6
    sep=' '
writeFile.write('\n')