2009-11-11 5 views
5

일부 텍스트에서 문장을 찾을 수있는 좋은 방법을 찾고 싶습니다. 무엇이 더 좋을까요? regexp 또는 split-method를 사용합니까? 당신의 아이디어?이일부 문장을 찾으십시오

입력 :

먼저 할 일은이 댓글 모델을 만드는 것입니다 - 제레미 스타 인에 의해 요청

으로는

예 몇 가지 예들이있다. 우리는 일반적인 방법으로 이것을 만들지 만 작은 차이는 있습니다. 아티클에 대한 주석을 작성했다면 외래 키를 저장하기 위해 모델에서 article_id라는 정수 필드를 갖겠지 만,이 경우 우리는 더 추상적 인 것을 필요로 할 것입니다.

첫 두 문장 :

먼저 할 일은이 댓글 모델을 만드는 것입니다. 우리는 일반적인 방법으로 이것을 만들지 만 작은 차이는 있습니다.

입력 :

T 씨는 한 친구를 의미합니다. 나는 그와 싸우는 것을 싫어한다.

첫 두 문장 :

T 씨는 한 친구를 의미합니다. 나는 그와 싸우는 것을 싫어한다.

입력 :

D.C. 스나이퍼는 버지니아 교도소에서 독극물 주사에 의해 실행 된 실행되었다. 사망은 9시 11 분에 발표되었습니다. ET.

첫 두 문장 :

D.C. 스나이퍼는 버지니아 교도소에서 독극물 주사에 의해 실행 된 실행되었다. 사망은 9시 11 분에 발표되었습니다. ET.

는 입력 : 그녀의 결론 발언에

상대 변호사는 "... 이것과 다른 많은 경우에,이 잘못이 권리를하지 않습니다."라고 말했다 배심원 단은 동의하는 것 같았다.

첫 두 문장 : 그녀의 결론 발언에

는 상대 변호사는 "... 이것과 다른 많은 경우에,이 잘못이 권리를하지 않습니다."라고 말했다 배심원 단은 동의하는 것 같았다.

여러분도 알다시피, 텍스트에서 두 문장을 결정하는 것은 쉽지 않습니다. 당신이 검색 무엇을 문장 알고있는 경우 :(

+0

입력 사항은 무엇입니까? 출력물을 어떻게 보이게할까요? –

+0

텍스트. 이 텍스트의 처음 2 개 (또는 어쩌면 그 이상)의 문장이 필요합니다. –

답변

0

은 정규식은

((YOUR SENTENCE HERE)|(YOUR OTHER SENTENCE)){1} 

분할 아마 그것은 또한 물건을 절약 할 필요없는 메모리의 꽤 많이 사용합니다 (검색을 잘한다 물론, 그것을 발견하면 정규식은 (당신이 검색 한 문장을 절약 할) 문장이 아니다 전체 텍스트)

+0

나는 선택한 텍스트에 2 개의 다른 구를 간단히 찾아야합니다. 예를 들어 "가장 먼저 할 일은 Comment 모델을 만드는 것입니다. 일반적인 방법으로이 방법을 만들지 만 약간의 차이가 있습니다. 기사에 대한 주석을 작성하는 경우 article_id라는 정수 필드가 있습니다. 외래 키를 저장하는 모델이지만,이 경우 우리는 더 추상적 인 것을 필요로 할 것입니다. "- 나는 단지 두 문장 만 필요합니다 -"첫 번째 ... "와"우리는 이것을 만들 것입니다 ... " –

+0

모든 문장을 "."(닷과 스페이스)로 나눈 것. 나는 단지 처음 2 개만 필요로한다. –

+0

그래서, 당신은 어떤 문장을 모르지만 두 가지가 있다는 것을 알고 있습니까? 네가 특정한 두 문장을 찾는 것처럼 들렸다. – Kobi

3
your_string = "First sentence. Second sentence. Third sentence" 
sentences = your_string.split(".") 
=> ["First sentence", " Second sentence", " Third sentence"] 

간단한 코드가 복잡 할 필요가 없습니다.

편집 : 이제는 실제 입력이 더 복잡하다는 것을 알았으므로 초기 예제에서는 엣지 경우를 고려하지 않으므로이 대답을 무시해야합니다. NLP의 초기 모습은 당신이 무엇을 얻고 있는지 보여줄 것입니다.

  • 날짜 : 내가 과거에 본 적이 가장자리 사례 중 일부는 조금 복잡 할

    일부 지역 DD.MM.YYYY

  • 따옴표를 사용 : 그는 —을 한숨 동안 "어쨌든, 지금해라."그런데 .... " 이것으로 충분했다.
  • 단위 : 그는 138km에 가고있었습니다. 고속도로에서 운전하는 동안.

이러한 텍스트를 구문 분석하려는 경우 분리 또는 정규식을 피해야합니다.

+0

괜찮지 만 your_string = "첫 번째 문장 ...... 두 번째 문장 ... 세 번째 문장"??? 어쩌면 더 좋을 것입니다 = your_string.split (".") ??? –

+0

추가 공간이 있음 –

+0

타원도 걱정해야합니다. – Garrett

1
irb(main):005:0> a = "The first sentence. The second sentence. And the third" 
irb(main):006:0> a.split(".")[0...2] 
=> ["The first sentence", " The second sentence"] 
irb(main):007:0> 

편집 : 여기 당신이 ". 이것은 문장 ...... 다른 그리고 또 다른 ..."경우 처리 방법은 다음과 같습니다

irb(main):001:0> a = "This is the first sentence ....... And the second. Let's not forget the third" 
=> "This is the first sentence ....... And the second. Let's not forget the thir 
d" 
irb(main):002:0> a.split(/\.+/) 
=> ["This is the first sentence ", " And the second", " Let's not forget the thi rd"] 

을 그리고 당신은 동일하게 적용 할 수 있습니다 범위 연산자 ...을 사용하여 첫 번째 문단을 추출하십시오.

+0

"스미스 씨가 문제가 생겼습니다. 스미스 여사가 프랑크 스테인스 박사에게 H.M.S. 빅토리에 관해 이야기하는 것을 도왔습니다." – ealdent

+0

아마도 먼저 단어 토큰 화가 필요할 것입니다. – Geo

0

텍스트를 문장으로 분할하는 경우 문장을 구분할 수있는 punction 표시를 결정해야합니다. 일반적으로 !, ?.입니다 (단, 처리하려는 텍스트가 모두 . 인 경우에만 처리하십시오).

인용 부호 안에 또는 약어의 일부로 나타날 수 있기 때문에 원하는 문장 부호를 발견하고 일종의 기계 학습 분류기를 실행하여 해당 문장이 새로운 문장을 시작하는지 확인하거나 그것이 다른 일을하는지. 여기에는 교육 데이터와 올바르게 구성된 분류자가 포함됩니다. 그리고 100 % 정확할 방법이 없으므로 100 % 정확하지 않습니다.

문장 분할 기법에 대한 자료를 찾고, 거기에있는 다양한 자연 언어 처리 툴킷을 살펴 보는 것이 좋습니다. 아직 Ruby를 찾지 못했지만 OpenNLP (Java 기반)를 좋아합니다.

1

대개 문장과 일치합니다.

/\S(?:(?![.?!]+\s).)*[.?!]+(?=\s|$)/m 

두 문장의 예를 보려면 처음 두 경기를하십시오.

4

눈치 챘을 것입니다. 문장 토큰 화는 처음 보일 때보 다 조금 더 까다 롭습니다. 따라서 기존 솔루션을 활용할 수도 있습니다. Punkt 문장 토큰 화 알고리즘은 NLP에서 널리 사용되고 있으며 here의 사용을 설명하는 Python Natural Language Toolkit에 좋은 구현이 있습니다. 그들은 또 다른 접근 방법을 설명합니다 here.

다른 구현이있을 수도 있고, Punkt 알고리즘을 설명하는 원래 paper을 읽을 수도 있습니다. Kiss, Tibor and Strunk, Jan (2006) : 감독되지 않은 다국어 문장 경계 검출. 전산 언어학 32 : 485-525.

토큰 화 문장에 대한 또 다른 스택 오버플로 질문 here을 읽을 수도 있습니다.

+0

우수 답변. –

관련 문제