2013-06-15 2 views
3

문장의 마지막 문자가 마침표, 콜론 또는 세미콜론이 될 수있는 텍스트에서 첫 번째 N 문장을 가져와야합니다. 예를 들어,이 텍스트 제공 :텍스트에서 첫 번째 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]) 

그러나 결과에서 구분 기호가 제거됩니다. 나는 정규식이나 기본 문자열 조작에 개방적이다. (다시 가입하고 구분 기호를 유지 피하기 위해) itertools.islice

>>> re.match(r'(?:[^.:;]+[.:;]){4}', text).group() 
'Lorem ipsum, dolor sit amet. consectetur adipisicing elit; sed do eiusmod tempor. incididunt ut labore:' 
+1

어떻게 처리할까요? 예를 들어, 오전 5시입니다. 아침에 여기와 내 C.D. 아주 잘 작동하지 않습니다 등 등; 너 니? 이걸로? _? – Ben

+0

@ 벤 예, "특별한 경우"가 있으며 그 결과는 인정됩니다. 완전히 완벽 할 필요는 없습니다. – flowfree

답변

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:' 

뭔가는 4를 포맷하여 사용자의 요구에 적응, 더 효율적인 것 :

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 
+0

감사합니다. 당신은 두 정규식을 설명해 주시겠습니까? – flowfree

+0

두 정규 표현식은 동일하지 않습니다. 첫 번째는 구두점 + 공백으로 나뉘며 두 번째 구두점은 구두점으로 나뉘어 표시됩니다 (OP가 원하는 것임). – Bakuriu

+0

+1 두 번째 것이 좋습니다. –

1

수있는 몇 re.finditer, 문자열 슬라이싱이 같은

+0

@jamylak 그것은 느릴 수 있습니다 - 내가 시간을 초과했다고 말할 수 없습니다. 나는 단지 그것이 캡쳐 그룹과 조인 및 다른 비트와 밥 없이는 틀림없이 더 가독하다고 생각합니다. (게다가 - 당신은 이미 그 대답을 가지고있었습니다 :)) –

0
import re 
sentenceEnd = re.compile('[.!?][\s]{1,2}(?=[A-Z])') 
sentenceLists = sentenceEnd.split(text, re.UNICODE) 

위 aproach 사용할 수있는 일은 마침표를 찾는 것입니다. 그 다음 문자가 대문자이고 마침표와 다음 문자 사이에 공백이 있으면 A.M.과 같은 경우를 처리합니다. 텍스트는 기본적으로 원래 텍스트가 될 것이며 유니 코드로 만들 것입니다.

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 자세한 내용은

+0

+1은'nltk'를 사용합니다. - 완벽하지는 않지만 놀랍게도 문장의 끝을 감지하는 좋은 일. – Aya

관련 문제