如何从课文中得到前N个句子?

2024-05-17 02:54:58 发布

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

我需要从文本中获取前N个句子,其中句子的最后一个字符可以是句点、冒号或分号。例如,给定本文:

Lorem ipsum, dolor sit amet. consectetur adipisicing elit; sed do eiusmod tempor.
incididunt ut labore: et dolore magna aliqua. Ut enim ad. minim veniam.

前4句话是

^{pr2}$

目前,我的代码使用.:、和{}作为分隔符拆分字符串,然后连接结果。在

import re
sentences = re.split('\. |: |;', text)
summary = ' '.join(sentences[:4])

但它将从结果中删除分隔符。我对正则表达式或基本字符串操作持开放态度。在


Tags: 字符串文本resentences字符句子分隔符ipsum
3条回答

所以,我知道这个问题是关于使用regex来查找句子,但是,出于同样的原因,regex不是解析html(不同语法类)的正确选择,对于涉及自然语言的问题,regex是一个更糟糕的选择。在

如果你的目标是描述句子,你必须寻找其他工具。我个人推荐nltk提供的Punkt语句标记器。下面是一个例子,说明为什么对于这个任务来说,这是一个比regex更好的选择。在

Punkt knows that the periods in Mr. Smith and Johann S. Bach do not mark 
sentence boundaries.  And sometimes sentences can start with non-capitalized 
words.  i is a good variable name.

http://nltk.org/api/nltk.tokenize.html了解更多信息。在

>>> import re
>>> text = "Lorem ipsum, dolor sit amet. consectetur adipisicing elit; sed do eiusmod tempor. incididunt ut labore: et dolore magna aliqua. Ut enim ad. minim veniam."
>>> ' '.join(re.split(r'(?<=[.:;])\s', text)[:4])
'Lorem ipsum, dolor sit amet. consectetur adipisicing elit; sed do eiusmod tempor. incididunt ut labore:'

这样做会更有效,请通过格式化4来调整您的需要:

^{2}$

可以将re.finditer与{}结合,并进行字符串切片(以避免回接并保留分隔符):

import re
from itertools import islice

delims = re.finditer('[.:;]', s)
try:
    print s[:next(islice(delims, 3, None)).end()]
except StopIteration:
    print s # whole string instead maybe as there's not enough delimiters

相关问题 更多 >