nltk sentence tokenizer 给出 AttributeError
nltk sentence tokenizer gives AttributeError
我是 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 句子分词器基于无监督算法:您给它一段长文本,它会计算出句子边界必须位于何处。但是您已经使用 list 句子(comments_list
中的前 300 个元素)训练了分词器,这是不正确的。分词器不知何故没有注意到,并在您尝试正确使用它时给您一些错误。
要解决此问题,请使用单个字符串训练分词器。您最好将字符串列表连接成一个这样的列表:
tokenizer = PunktSentenceTokenizer(" ".join(comments_list[:300]))
PS。当您对文字字符串进行标记时,您一定是错误地认为它可以成功运行。当然,有效代码与您问题中的代码之间还有其他差异。
我是 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 句子分词器基于无监督算法:您给它一段长文本,它会计算出句子边界必须位于何处。但是您已经使用 list 句子(comments_list
中的前 300 个元素)训练了分词器,这是不正确的。分词器不知何故没有注意到,并在您尝试正确使用它时给您一些错误。
要解决此问题,请使用单个字符串训练分词器。您最好将字符串列表连接成一个这样的列表:
tokenizer = PunktSentenceTokenizer(" ".join(comments_list[:300]))
PS。当您对文字字符串进行标记时,您一定是错误地认为它可以成功运行。当然,有效代码与您问题中的代码之间还有其他差异。