在字符串中查找字符/单词的周围句子

2024-05-23 19:02:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用python从包含给定子字符串的字符串中获取句子。在

我可以访问字符串(一个学术摘要)和一个包含开始和结束索引的亮点列表。例如:

{
  abstract: "...long abstract here..."
  highlights: [
    {
      concept: 'a word',
      start: 1,
      end: 10
    }
    {
      concept: 'cancer',
      start: 123,
      end: 135
    }
  ]
}

我在每个突出显示处循环,在摘要中找到它的起始索引(结尾并不重要,因为我只需要在一个句子中找到一个位置),然后不知何故需要确定索引出现在哪个句子中。在

我可以使用nltk.tonenize.sent_tokenize将摘要标记成句子,但这样做会使索引位置变得无用。在

我该如何着手解决这个问题?我想regex是一种选择,但是nltk标记器似乎是一种很好的方法,不使用它将是一种遗憾。。或者通过查找上一个句号/感叹号/问号后的字符数来重置起始索引?在


Tags: 字符串标记亮点abstract列表herestartconcept
3条回答

另一个选择(尽管很难说它在不同定义的文本中有多可靠)是将文本分成一个句子列表并对照它们进行测试:

re.split('(?<=\?|!|\.)\s{0,2}(?=[A-Z]|$)', text)

你说得对,NLTK标记器确实是您在这种情况下应该使用的,因为它足够健壮,可以处理大多数句子的定界,包括用“引号”结束句子。您可以做如下操作(paragraph来自随机生成器):

从,

from nltk.tokenize import sent_tokenize

paragraph = "How does chickens harden over the acceptance? Chickens comprises coffee. Chickens crushes a popular vet next to the eater. Will chickens sweep beneath a project? Coffee funds chickens. Chickens abides against an ineffective drill."
highlights = ["vet","funds"]
sentencesWithHighlights = []

最直观的方式:

^{pr2}$

但是使用这种方法,我们实际上得到了一个3x嵌套的for循环。这是因为我们首先检查每个sentence,然后检查每个highlight,然后检查sentence中的每个子序列。在

我们可以获得更好的性能,因为我们知道每个亮点的开始索引:

highlightIndices = [100,169]
subtractFromIndex = 0
for sentence in sent_tokenize(paragraph):
    for index in highlightIndices:
        if 0 < index - subtractFromIndex < len(sentence):
            sentencesWithHighlights.append(sentence)
            break
    subtractFromIndex += len(sentence)

在任何一种情况下,我们得到:

sentencesWithHighlights = ['Chickens crushes a popular vet next to the eater.', 'Coffee funds chickens.']

我假设你所有的句子都以这三个字符中的一个结束:!?.

在突出显示列表上循环,创建一个regexp组:

(?:list|of|your highlights)

然后将整个摘要与此regexp匹配:

^{pr2}$

这样,您将得到一个句子,其中至少包含每个匹配项的第一个子组(RegExr)中的一个亮点。在

相关问题 更多 >