【问题标题】:Finding exact position of tokenized sentences找到标记化句子的确切位置
【发布时间】:2013-02-08 15:49:56
【问题描述】:

我想提取文本的句子,但我需要结果的确切位置。 NLTK 中tokenize.sent_tokenize 的当前实现不返回提取句子的位置,所以我尝试了这样的事情:

offset, length = 0, 0
for sentence in tokenize.sent_tokenize(text):
    length = len(sentence)
    yield sentence, offset, length
    offset += length

但它不会返回句子的确切位置,因为sent_tokenize 删除了结果句子边界之外的一些书写字符(例如换行符、额外空格和...)。我不想使用简单的正则表达式模式来拆分句子,我知道在这种情况下这个问题是微不足道的。

谢谢。

【问题讨论】:

    标签: python tokenize nltk


    【解决方案1】:

    您可以直接使用PunktSentenceTokenizer(用于实现sent_tokenize()):

    from nltk.tokenize.punkt import PunktSentenceTokenizer
    
    text = 'Rabbit say to itself "Oh dear! Oh dear! I shall be too late!"'
    for start, end in PunktSentenceTokenizer().span_tokenize(text):
        length = end - start
        print buffer(text, start, length), start, length
    

    如果您不介意复制每个句子,您可以使用text[start:end] 而不是buffer(text, start, end - start)

    【讨论】:

    • 这里的buffer 是什么?
    • @kkgarg: buffer 是 Python 2 中的内置函数(这里使用它是为了避免不必要的复制/二次行为)。
    【解决方案2】:

    这并不难,这里有一个简单的解决方案:

    offset, length = 0, 0
    for sentence in tokenize.sent_tokenize(text):
        # fix ignored characters
        while text[offset] != sentence[0]:
            offset += 1
    
        length = len(sentence)
        yield sentence, offset, length
        offset += length
    

    【讨论】:

    • 尝试用offset = text.find(sentence, offset) 替换while-loop。
    • 重点是您应该避免重新实现已记录、测试甚至可能为您优化的现有方法除非您有不使用它们的令人信服的理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多