9

我在使用 .text 文件消除和标记化 .text 文件时遇到了困难nltk。我不断收到以下内容AttributeError: 'list' object has no attribute 'lower'

我只是不知道我做错了什么,尽管这是我第一次做这样的事情。以下是我的代码行。我将不胜感激任何建议,谢谢

    import nltk
    from nltk.corpus import stopwords
    s = open("C:\zircon\sinbo1.txt").read()
    tokens = nltk.word_tokenize(s)
    def cleanupDoc(s):
            stopset = set(stopwords.words('english'))
        tokens = nltk.word_tokenize(s)
        cleanup = [token.lower()for token in tokens.lower() not in stopset and  len(token)>2]
        return cleanup
    cleanupDoc(s)
4

4 回答 4

23

您可以使用stopwordsNLTK 中的列表,请参阅如何使用 nltk 或 python 删除停用词

而且很可能您还想去掉标点符号,您可以使用string.punctuation,请参阅http://docs.python.org/2/library/string.html

>>> from nltk import word_tokenize
>>> from nltk.corpus import stopwords
>>> import string
>>> sent = "this is a foo bar, bar black sheep."
>>> stop = set(stopwords.words('english') + list(string.punctuation))
>>> [i for i in word_tokenize(sent.lower()) if i not in stop]
['foo', 'bar', 'bar', 'black', 'sheep']
于 2014-03-11T11:31:04.650 回答
1
import nltk
from nltk.corpus import stopwords
def cleanupDoc(s):
     stopset = set(stopwords.words('english'))
     tokens = nltk.word_tokenize(s)
     cleanup = " ".join(filter(lambda word: word not in stopset, s.split()))
     return cleanup
s = "I am going to disco and bar tonight"
tokens = nltk.word_tokenize(s)
x = cleanupDoc(s)
print x

此代码可以帮助解决上述问题。

于 2014-03-10T12:55:29.027 回答
1

从错误消息中,您似乎正在尝试将列表而不是字符串转换为小写。您tokens = nltk.word_tokenize(s)可能没有返回您期望的内容(这似乎是一个字符串)。

了解您的文件的格式会很有帮助sinbo.txt

几个语法问题:

  1. 导入应为小写:import nltk

  2. 该行s = open("C:\zircon\sinbo1.txt").read()正在读取整个文件,而不是一次读取一行。这可能是有问题的,因为 word_tokenize 作用于单个句子,而不是任何标记序列。当前行假定您的sinbo.txt文件包含一个句子。如果没有,您可能希望 (a) 在文件上使用 for 循环而不是使用 read() 或 (b) 对一大堆按标点符号划分的句子使用 punct_tokenizer。

  3. cleanupDoc您的函数的第一行没有正确缩进。您的函数应该看起来像这样(即使其中的函数发生了变化)。

    import nltk
    from nltk.corpus import stopwords 
    def cleanupDoc(s):
     stopset = set(stopwords.words('english'))
     tokens = nltk.word_tokenize(s)
     cleanup = [token.lower() for token in tokens if token.lower() not in stopset and  len(token)>2]
     return cleanup
    
于 2013-07-01T21:54:17.577 回答
0

在您的特定情况下,错误在于 cleanup = [token.lower()for token in tokens.lower() not in stopset and len(token)>2]

tokens 是一个列表,因此您不能对列表执行 tokens.lower() 操作。因此,编写上述代码的另一种方法是,

cleanup = [token.lower()for token in tokens if token.lower() not in stopset and  len(token)>2]

我希望这有帮助。

于 2019-09-25T17:04:52.480 回答