我试图从使用python的包含给定子字符串的字符串中获取句子.
我可以访问字符串(学术摘要)和包含开始和结束索引的突出显示列表.例如:
{
abstract: "...long abstract here..."
highlights: [
{
concept: 'a word',
start: 1,
end: 10
}
{
concept: 'cancer',
start: 123,
end: 135
}
]
}
Run Code Online (Sandbox Code Playgroud)
我循环遍历每个突出显示,在摘要中找到它的起始索引(结尾并不重要,因为我只需要在句子中获取位置),然后以某种方式需要识别索引出现的句子.
我能够使用抽象将抽象标记为句子nltk.tonenize.sent_tokenize
,但通过这样做,我使索引位置无用.
我该如何解决这个问题?我认为正则表达式是一个选项,但是nltk标记化器似乎是一种很好的方式来做它,如果不使用它将是一种耻辱.或者以某种方式重置起始索引,通过查找自上一次完全停止后的字符数/感叹号/问号?
你是对的,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 = []
Run Code Online (Sandbox Code Playgroud)
最直观的方式:
for sentence in sent_tokenize(paragraph):
for highlight in highlights:
if highlight in sentence:
sentencesWithHighlights.append(sentence)
break
Run Code Online (Sandbox Code Playgroud)
但是使用这种方法我们实际上有一个有效的3x嵌套for
循环.这是因为我们首先要检查每一个sentence
,那么每个highlight
,然后每个子序列sentence
的highlight
.
我们可以获得更好的性能,因为我们知道每个突出显示的起始索引:
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)
Run Code Online (Sandbox Code Playgroud)
无论哪种情况,我们得到:
sentencesWithHighlights = ['Chickens crushes a popular vet next to the eater.', 'Coffee funds chickens.']
Run Code Online (Sandbox Code Playgroud)