Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python nltk语句标记器提供AttributeError_Python_Python 3.x_Nltk_Tokenize_Text Mining - Fatal编程技术网

Python nltk语句标记器提供AttributeError

Python nltk语句标记器提供AttributeError,python,python-3.x,nltk,tokenize,text-mining,Python,Python 3.x,Nltk,Tokenize,Text Mining,我对python和NLTK非常陌生。 有一个问题困扰着我: 当我这样做的时候 tokenized = custom_sent_tokenizer.tokenize("some long text") 它给了我完美的结果。但是,当我将这个硬编码字符串更改为一个包含大量文本的变量时,它给了我主题中提到的错误,即: tokenized = custom_sent_tokenizer.tokenize(text) ... AttributeError: 'list' object has no att

我对python和NLTK非常陌生。 有一个问题困扰着我:

当我这样做的时候

tokenized = custom_sent_tokenizer.tokenize("some long text")
它给了我完美的结果。但是,当我将这个硬编码字符串更改为一个包含大量文本的变量时,它给了我主题中提到的错误,即:

tokenized = custom_sent_tokenizer.tokenize(text)
...
AttributeError: 'list' object has no attribute 'abbrev_types'
以下是我的完整代码:

from __future__ import division
import urllib.request
import csv
import nltk
from string import punctuation
from nltk.corpus import stopwords
from nltk.tokenize import PunktSentenceTokenizer

comments = open("CNPS_Comments.txt").read()
comments_list = comments.split('\n')

custom_sent_tokenizer = PunktSentenceTokenizer(comments_list[:300])
##tokenized = custom_sent_tokenizer.tokenize("some long text")
text=""
for comment in comments_list:
   text += comment

tokenized = custom_sent_tokenizer.tokenize(text)
def process_content():
  try:
    for i in tokenized[:5]:
        words = nltk.word_tokenize(i)
        tagged = nltk.pos_tag(words)
        print(tagged)

except Exception as e:
    print(str(e))


process_content()

今天我开始学习python,可能有很多事情我做得不够有效

给你带来麻烦的那一行是正确的:这就是你应该如何使用句子标记器,用一个字符串作为它的参数。由于您创建了一个怪物,所以出现了一个错误:-)

Punkt句子标记器基于一个无监督的算法:你给它一个长文本,它会计算出句子边界必须在哪里。但是您已经用一系列句子(注释列表中的前300个元素)训练了标记器,这是不正确的。不知何故,标记器没有注意到,并且在您尝试正确使用它时,会给您一些错误

要解决此问题,请使用单个字符串训练标记器。您最好将字符串列表合并为一个字符串列表,如下所示:

tokenizer = PunktSentenceTokenizer(" ".join(comments_list[:300]))

另外,当您标记一个文字字符串时,您一定是错误的,因为它成功地工作了。当然,在有效的代码和您问题中的代码之间还有其他区别。

给您带来麻烦的那一行是正确的:这就是您应该如何使用句子标记器,以单个字符串作为参数。由于您创建了一个怪物,所以出现了一个错误:-)

Punkt句子标记器基于一个无监督的算法:你给它一个长文本,它会计算出句子边界必须在哪里。但是您已经用一系列句子(注释列表中的前300个元素)训练了标记器,这是不正确的。不知何故,标记器没有注意到,并且在您尝试正确使用它时,会给您一些错误

要解决此问题,请使用单个字符串训练标记器。您最好将字符串列表合并为一个字符串列表,如下所示:

tokenizer = PunktSentenceTokenizer(" ".join(comments_list[:300]))

另外,当您标记一个文字字符串时,您一定是错误的,因为它成功地工作了。当然,在有效的代码和您问题中的代码之间还有其他区别。

对于注释中的注释_list:text+=注释这看起来很糟糕,因为我可以使用“comments”对象本身而不是“text”。但我也试过了,但没有成功。这段代码将列表转换为单个字符串。有更好的方法,但你错了,不需要它。对于注释中的注释\u列表:text+=注释这看起来很糟糕,因为我本可以使用“comments”对象本身而不是“text”。但我也试过了,但没有成功。这段代码将列表转换为单个字符串。有更好的方法,但你错了,不需要。太好了!看起来它现在可以工作了。所以问题是用句子列表来训练标记器。这不正确的原因是什么?我假设我用300条不同的注释来训练它。因为这是一个无监督的算法。你不给它预先分开的句子,所以一个文本就足够了。(如果你的评论可能包含多个句子,你会问为什么你不能用多个文本进行训练:因为没有人费心去实现它。)太棒了!看起来它现在可以工作了。所以问题是用句子列表来训练标记器。这不正确的原因是什么?我假设我用300条不同的注释来训练它。因为这是一个无监督的算法。你不给它预先分开的句子,所以一个文本就足够了。(如果你的评论可能包含多个句子,你会问为什么你不能用多个文本进行训练:因为没有人费心去实现它。)