【问题标题】:NLTK Sentence Tokenizer, custom sentence startersNLTK Sentence Tokenizer,自定义句子开头
【发布时间】:2015-04-20 11:29:38
【问题描述】:

我正在尝试使用来自 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']

【问题讨论】:

    标签: python python-3.x nltk tokenize


    【解决方案1】:

    您可以继承 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 用于句子标记化而不是简单地使用诸如多分隔符拆分函数之类的一个原因是,因为它能够学习如何区分用于句子的标点符号和用于其他目的的标点符号,例如例如,在“先生”中。

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

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多