我试图用nltk中的PunktSentenceTokenizer
将文本拆分成句子。该文本包含以项目符号开头的列表,但它们不会被识别为新句子。我试图添加一些参数但是没有用。还有另一种方式吗?
以下是一些示例代码:
from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktParameters
params = PunktParameters()
params.sent_starters = set(['•'])
tokenizer = PunktSentenceTokenizer(params)
tokenizer.tokenize('• I am a sentence • I am another sentence')
['• I am a sentence • I am another sentence']
答案 0 :(得分:4)
您可以继承PunktLanguageVars
并调整sent_end_chars
属性以满足您的需求,如下所示:
from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktLanguageVars
class BulletPointLangVars(PunktLanguageVars):
sent_end_chars = ('.', '?', '!', '•')
tokenizer = PunktSentenceTokenizer(lang_vars = BulletPointLangVars())
tokenizer.tokenize(u"• I am a sentence • I am another sentence")
这将产生以下输出:
['•', 'I am a sentence •', 'I am another sentence']
但是,这会使•句子结束标记,而在您的情况下,它更像是句子开始标记。因此这个示例文本:
我介绍一个句子列表。
- 我是第一句话
- 我是第二句话
我也是一个人!
根据文本的详细信息,会产生如下内容:
>>> tokenizer.tokenize("""
Look at these sentences:
• I am sentence one
• I am sentence two
But I am one, too!
""")
['\nLook at these sentences:\n\n•', 'I am sentence one\n•', 'I am sentence two\n\nBut I am one, too!\n']
PunktSentenceTokenizer
用于句子标记而不是简单地使用类似多分隔符分割函数的一个原因是,因为它能够学习如何区分用于句子的标点符号和用于其他目的的标点符号例如,在" Mr。"中。
PunktSentenceTokenizer
来实现它并不是真正设计的。
如何在细节上实现这一点取决于文本中这种标记的使用方式。