NLTK Sentence Tokenizer,自定义句子开头

rax*_*xer 2 python tokenize nltk python-3.x

我正在尝试使用PunktSentenceTokenizerfrom nltk将文本拆分成句子。文本包含以项目符号开头的列表,但它们不会被识别为新句子。我试图添加一些参数,但没有用。还有其他方法吗?

下面是一些示例代码:

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']
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以子类化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")
Run Code Online (Sandbox Code Playgroud)

这将导致以下输出:

['•', 'I am a sentence •', 'I am another sentence']
Run Code Online (Sandbox Code Playgroud)

但是,这使 • 成为句子结束标记,而在您的情况下,它更像是句子开始标记。因此这个示例文本:

我介绍一个句子列表。

  • 我是第一句话
  • 我是第二句

我也是其中之一!

根据您文本的详细信息,会产生如下结果:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

原因之一PunktSentenceTokenizer是用于句子符号化,而不是简单地采用类似多分隔符分割功能,因为它能够学习如何使用用于其他目的的句子和标点符号标点符号区分,如“先生”,例如。

但是,对于 • 应该没有这样的复杂性,因此我建议您编写一个简单的解析器来预处理项目符号点格式,而不是滥用PunktSentenceTokenizer它不是真正设计的东西。如何详细实现这一点取决于文本中如何准确使用这种标记。