gpt4 book ai didi

python - NLTK 句子边界错误

转载 作者:行者123 更新时间:2023-12-01 03:56:53 25 4
gpt4 key购买 nike

我正在阅读《使用 Python 进行自然语言处理》一书的第 6 章 ( http://www.nltk.org/book/ch06.html )

我正在尝试使用 cess_esp 语料库复制句子切分的实验。我逐行跟踪代码,它似乎有效,直到我尝试使用它来分段我自己的文本。

>>> import nltk
>>> from nltk.corpus import cess_esp
>>> sentences = cess_esp.sents()
>>> tokens = []
>>> boundaries = set()
>>> offset = 0
>>> for sent in sentences:
tokens.extend(sent)
offset += len(sent)
boundaries.add(offset-1)


>>> def punct_features(tokens,i):
return {'next-word-capitalized': tokens[i+1][0].isupper(),
'prev-word': tokens[i-1].lower(),
'punct': tokens[i],
'prev-word-is-one-char': len(tokens[i-1]) == 1}

>>> featureset = [(punct_features(tokens, i), (i in boundaries))
for i in range(1, len(tokens)-1)
if tokens[i] in '.?!']
>>> size = int(len(featureset) * 0.1)
>>> train_set, test_set = featureset[size:], featureset[:size]
>>> classifier = nltk.NaiveBayesClassifier.train(train_set)
>>> nltk.classify.accuracy(classifier, test_set)
0.9983388704318937

到目前为止一切顺利。但是当我尝试使用该函数来分段文本时,出现错误。

def segment_sentences(words):
start = 0
sents = []
for i, word in enumerate(words):
if word in '.?!' and classifier.classify(punct_features(words, i)) == True:
sents.append(words[start:i+1])
start = i+1
if start < len(words):
sents.append(words[start:])
return sents

new_text = ['En', 'un', 'lugar', 'de', 'la', 'Mancha', ',', 'de', 'cuyo', 'nombre', 'no', 'quiero', 'acordarme', ',', 'no', 'ha', 'mucho', 'tiempo', 'que', 'vivía', 'un', 'hidalgo', 'de', 'los', 'de', 'lanza', 'en', 'astillero', ',', 'adarga', 'antigua', ',', 'rocín', 'flaco', 'y', 'galgo', 'corredor', '.', 'Una', 'olla', 'de', 'algo', 'más', 'vaca', 'que', 'carnero', ',', 'salpicón', 'las', 'más', 'noches', ',', 'duelos', 'y', 'quebrantos', 'los', 'sábados', ',', 'lantejas', 'los', 'viernes', ',', 'algún', 'palomino', 'de', 'añadidura', 'los', 'domingos', ',', 'consumían', 'las', 'tres', 'partes', 'de', 'su', 'hacienda', '.', 'El', 'resto', 'della', 'concluían', 'sayo', 'de', 'velarte', ',', 'calzas', 'de', 'velludo', 'para', 'las', 'fiestas', ',', 'con', 'sus', 'pantuflos', 'de', 'lo', 'mesmo', ',', 'y', 'los', 'días', 'de', 'entresemana', 'se', 'honraba', 'con', 'su', 'vellorí', 'de', 'lo', 'más', 'fino', '.']

segment_sentences(new_text)
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
segment_sentences(texto)
File "<pyshell#26>", line 5, in segment_sentences
if word in '.?!' and classifier.classify(punct_features(words, i)) == True:
File "<pyshell#16>", line 2, in punct_features
return {'next-word-capitalized': tokens[i+1][0].isupper(),
IndexError: list index out of range

我一直在调整一些数字,看看是否可以修复索引超出范围的错误,但它不起作用。

感谢任何帮助

最佳答案

看起来您需要循环 enumerate(words[:-1]) 而不是 enumerate(words)

正如您所写的那样,您正在对列表中的最后一个单词调用punct_features(words, i)。当列表中最后一个单词的索引 (i) 传递给 punct_features() 时,您将尝试访问 words[i+1] (如 tokens[i+1]。由于 words 中只有 i 项,因此您会收到 IndexError.

关于python - NLTK 句子边界错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37299003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com