2012-04-03 6 views
0

문자열에서 맨 처음 문장을 자르는 문제로 고민하고 있습니다. 점으로 끝나는 약어가 없다면 문제가되지 않을 것입니다.Python에서 정규 표현식 사용

  • 문자열이 나는 등 치즈, 자동차를 좋아 '= 그러나 나의 가장 좋아하는 웹 사이트에 유래입니다 :

    그래서 내 예입니다. 내 새 말은 랜디라고. '

그리고 결과가 있어야한다 :

  • 결과 = 'I 등 치즈, 자동차를 좋아하지만 내 가장 좋아하는 웹 사이트에 유래이다.'

일반적으로 내가 함께 할 것 :

re.findall(r'^(\s*.*?\s*)(?:\.|$)', event)

하지만 위의

언급처럼 나는, 몇 가지 미리 정의 된 단어를 건너 뛰고 싶습니다

나는 몇과 함께 그들 중 누구도 일하지 않았다.

+4

http://stackoverflow.com/a/1732454/203705 - 자연 언어에 대한 이중 사실을. 정말 무엇을하려고합니까? 당신이 해결하려고하는 더 큰 문제는 무엇입니까? –

+0

일부 이벤트 참조가있는 문자열이 있는데이 이벤트의 머리 글자 어를 만듭니다. 기본 정보가 사건의 이름과 함께 첫 번째 문장에 있음을 알게되었지만 때때로 인턴과 같은 약어가 사용됩니다. = 국제적인 등등. 그리고 이것은 엉덩이에 정말로 고통 스러울 수 있습니다. – skornos

+0

내가 Tony the Pony 링크를 게시 한 지난 번에, [tchrist] (http://stackoverflow.com/users/471272/tchrist)는 목재 작업에서 나왔다. 어쨌든 제약이 있습니까? 아니면 임의의 영어 문장에 대해 이야기하고 있습니까? 사전에 정의 된 단어 목록 ('etc.'포함)이 문장의 마지막에 나타나지 않거나 문장이 항상 대문자와 단어 뒤에 나오는 단어라고 말할 수 있다면 도움이 될 것입니다. 결코하지 않습니다. – cha0site

답변

4

당신은 약어 약어의 당신의 임시 모음 대신 무엇인지 알아 내야 겠다는 알고리즘을 사용하여 이런 종류의 일을 수행 NLTK's Punkt sentence tokenizer을 시도 할 수 있습니다.

NLTK에는 영어에 대한 사전 교육 된 것이 포함되어 있습니다. 소스 코드에서

nltk.data.load('tokenizers/punkt/english.pickle') 

: 그것을로드

>>> sent_detector = nltk.data.load('tokenizers/punkt/english.pickle') 
>>> print '\n-----\n'.join(sent_detector.tokenize(text.strip())) 
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. 
+0

+1,이게 좋습니다. 영어는 힘들고 정규식에 적합하지 않습니다. –

+0

감사합니다. 실제로 NLTK를 사용하고 있지만 문장의 단어를 구문 분석하기 때문에 이상적인 솔루션 인 것 같습니다.하지만 라이브러리를 가지고 있지만 LookupError가 발생하여 일부분이 누락 된 것 같습니다. – skornos

+0

@skornos [이 질문에] 적절한 데이터 파일이 누락 된 것 같습니다 (http://stackoverflow.com)./questions/4867197/failed-loading-korean-pickle-with-nltk-data-load). – Dougal

1

문장 끝 문자 다음에 첫 번째 대문자를 찾는 것은 어떻습니까? 물론, 절대 안전한 것은 아닙니다.

import re 
r = re.compile("^(.+?[.?!])\s*[A-Z]") 
print r.match('I like cheese, cars, etc. but my the most favorite website is stackoverflow. My new horse is called Randy.').group(1) 

출력

'I like cheese, cars, etc. but my the most favorite website is stackoverflow.'