我是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,可能会有很多我在这里没有做到的事情。
答案 0 :(得分:3)
给你带来麻烦的那条线是正确的:这就是你应该如何使用句子标记器,一个字符串作为它的参数。你得到一个错误,因为你创造了一个怪物: - )
Punkt句子标记器基于无监督算法:你给它一个长文本,它可以找出句子边界必须在哪里。但是您已经使用列表句子(comments_list
中的前300个元素)训练了您的标记器,这是不正确的。不知何故,当你试图正确使用它时,令牌器不会注意到,并且会给你一些错误。
要解决此问题,请使用单个字符串训练您的标记生成器。您最好将字符串列表加入如下:
tokenizer = PunktSentenceTokenizer(" ".join(comments_list[:300]))
PS。在标记文字字符串时,它必须是错误的。当然,有效的代码和你问题中的代码之间还存在其他差异。