【问题标题】:How to segment text into sub-sentences based on enumerators?如何根据枚举器将文本分割成子句?
【发布时间】:2015-10-25 19:43:00
【问题描述】:

我正在使用 nltk PunktSentenceTokenizer() 在 python 中为文本分段句子。但是,有很多长句以枚举的方式出现,我需要在这种情况下获取子句。

例子:

The api allows the user to achieve following goals: (a) aXXXXXX ,(b)bXXXX, (c) cXXXXX. 

所需的输出是:

"The api allows the user to achieve following goals aXXXXX. ""The api allows the user to achieve following goals bXXXXX.""The api allows the user to achieve following goals cXXXXX. "

我怎样才能实现这个目标?

【问题讨论】:

  • 我猜你不希望 The required output would be 成为实际输出的一部分?
  • 是的,你是对的。我修好了。

标签: python nltk text-segmentation


【解决方案1】:

我将跳过明显的问题(即:“到目前为止,您尝试过什么?”)。正如您可能已经发现的那样,PunktSentenceTokenizer 在这里并不能真正帮助您,因为它会将您的输入句子留在一个片段中。 最佳解决方案在很大程度上取决于您输入的可预测性。以下将适用于您的示例,但您可以看到它依赖于冒号和一些逗号。如果他们不在那里,它不会帮助你。

import re
from nltk import PunktSentenceTokenizer
s = 'The api allows the user to achieve following goals: (a) aXXXXXX ,(b)bXXXX, (c) cXXXXX.'
#sents = PunktSentenceTokenizer().tokenize(s)

p = s.split(':')
for l in p[1:]:
    i = l.split(',')
    for j in i:
        j = re.sub(r'\([a-z]\)', '', j).strip()
        print("%s: %s" % (p[0], j))

【讨论】:

  • 总是有一个冒号,但并不总是逗号分隔。还是谢谢!
【解决方案2】:

要获取子序列,您可以使用RegExp Tokenizer

如何使用它来拆分句子的示例如下所示:

from nltk.tokenize.regexp import regexp_tokenize

str1 = 'The api allows the user to achieve following goals: (a) aXXXXXX ,(b)bXXXX, (c) cXXXXX.'

parts =  regexp_tokenize(str1, r'\(\w\)\s*', gaps=True)

start_of_sentence = parts.pop(0)

for part in parts:
    print(" ".join((start_of_sentence, part)))

【讨论】:

  • 哈,15 小时前问了一个问题,但你比我早 1 分钟 :)。实际上更喜欢您的解决方案!
  • 谢谢。我实际上已经完成了使用非常相似的方法。
猜你喜欢
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2015-10-29
  • 2014-09-20
  • 1970-01-01
  • 2017-04-18
相关资源
最近更新 更多