3

我需要从文本中获取前 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 句话是,

Lorem ipsum, dolor sit amet. consectetur adipisicing elit; sed do eiusmod tempor.
incididunt ut labore:

目前,我的代码使用.,:;作为分隔符拆分字符串,然后加入结果。

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

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

4

4 回答 4

4
>>> 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:'
于 2013-06-15T14:02:22.010 回答
3

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

如果您的目标是实际描述句子,则必须寻找其他工具。我个人会推荐 nltk 提供的 Punkt 句子标记器。下面是一个示例,说明为什么从根本上说,对于这项任务来说,这是一个比正则表达式更好的选择。

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了解更多信息。

于 2013-06-15T14:39:13.237 回答
1

可以re.finditer结合itertools.islice, 和字符串切片(以避免加入并保留分隔符):

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
于 2013-06-15T14:11:58.130 回答
0
import re
sentenceEnd = re.compile('[.!?][\s]{1,2}(?=[A-Z])')
sentenceLists = sentenceEnd.split(text, re.UNICODE)

可以使用上面的方法,它会做的是寻找一个句号,并确保之后的下一个字符是大写字母,并且句号和下一个字母之间有一个空格,这将处理大小写例如 AM 。文本基本上是您的原始文本所在的位置,它将确保它是未编码的。

于 2013-06-15T14:26:56.710 回答