2010-07-25 13 views
5

Pytanie Pythona dla początkujących:Ogranicz liczbę zdań w ciągu znaków

Mam ciąg znaków z liczbą x zdań. (.?! Może kończyć się lub lub) Jak wyodrębnić pierwsze 2 zdania

+6

Rozważmy : Czy to 2 zdania? – unutbu

+0

Przefiltruj listę zdań, aby usunąć te, które kończą się pojedynczymi literami lub określonymi skrótami, takie jak "Mr", "Pani", "Pani", "Ltd", "itd." Itd. Sprawdź listę lub utwórz własną . Niektóre są nieokreślone - na przykład "Msza". niekoniecznie skrót oznaczający stan? –

+1

Jaki problem próbujesz rozwiązać, który prowadzi do tego? Przetwarzanie języka naturalnego nie jest przeznaczone dla osób o słabym sercu, więc jeśli potrafisz lepiej określić swoją sytuację, możesz uzyskać bardziej przydatne odpowiedzi. – Daenyth

Odpowiedz

10

Pomijając względy, takie jak wtedy, gdy . stanowi zakończenie zdania:

import re 
' '.join(re.split(r'(?<=[.?!])\s+', phrase, 2)[:-1]) 

EDIT: Kolejne podejście, które właśnie przyszło mi do głowy to:

re.match(r'(.*?[.?!](?:\s+.*?[.?!]){0,1})', phrase).group(1) 

Uwagi:

  1. Podczas gdy pierwsze rozwiązanie pozwala zastąpić 2 z innego numeru, aby wybrać inną liczbę zdań, w drugim roztworze, zmienić 1 w {0,1} jeden mniejsza od liczby zdań, które chcesz wyodrębnić.
  2. Drugie rozwiązanie nie jest tak solidne w obsłudze, np. Puste ciągi lub ciągi bez interpunkcji. Mogłoby tak być, ale regex byłby jeszcze bardziej skomplikowany niż już jest i wolałbym nieco mniej wydajne pierwsze rozwiązanie niż nieczytelny bałagan.
+0

Dzięki, to zadziałało, mimo że zwróciło listę. Próbowałem przywrócić go do łańcucha za pomocą pętli for i wstawiania. Tylko że nie ma? lub! zdania w moich strunach już :) – anroots

+0

jeśli 'zdanie' jest listą, która zostanie zwrócona to po prostu zrób' "." .join (zdania) ', aby uzyskać ją jako ciąg – aaronasterling

+0

@onarasterling: Zmieniłem moją odpowiedź, aby zachować interpunkcja i powróć do zdań. –

1

Rozwiązałem to tak: Separating sentences, chociaż komentarz na tym stanowisku również wskazuje NLTK, choć nie wiem, jak znaleźć segmentacji zdanie na ich stronie ...

0

Oto jak yo może to zrobić:

str = "Sentence one? Sentence two. Sentence three? Sentence four. Sentence five." 
sentences = str.split(".") 
allSentences = [] 
for sentence in sentences 
    allSentences.extend(sentence.split("?")) 

print allSentences[0:3] 

Istnieje prawdopodobnie lepsze sposoby, czekam na spotkanie z nimi.

+0

Ah, rozwiązanie Marcelo jest znacznie lepsze. Nie wiedziałem, że istnieje funkcja podziału regex. – TimCinel

0

Oto wyjaśnienie krok po kroku, jak rozmontować, wybrać pierwsze dwa zdania i ponownie je złożyć. Jak zauważyli inni, nie uwzględnia to faktu, że nie wszystkie znaki kropka/pytanie/wykrzyknik są w rzeczywistości separatorami zdań.

import re 

testline = "Sentence 1. Sentence 2? Sentence 3! Sentence 4. Sentence 5." 

# split the first two sentences by the dot/question/exclamation. 
sentences = re.split('([.?!])', testline, 2) 
print "result of split: ", sentences 

# toss everything else (the last item in the list) 
firstTwo = sentences[:-1] 
print firstTwo 

# put the first two sentences back together 
finalLine = ''.join(firstTwo) 
print finalLine 
0

Generator alternatywa przy moim funkcję użytkową powracającego kawałek sznurka aż do każdej pozycji w sekwencji wyszukiwania: „Pan Rogers poszedł do sklepu”

from itertools import islice 
testline = "Sentence 1. Sentence 2? Sentence 3! Sentence 4. Sentence 5." 
def multis(search_sequence,text,start=0): 
    """ multisearch by given search sequence values from text, starting from position start 
     yielding tuples of text before found item and found sequence item""" 
    x='' 
    for ch in text[start:]: 
     if ch in search_sequence: 
      if x: yield (x,ch) 
      else: yield ch 
      x='' 
     else: 
      x+=ch 
    else: 
     if x: yield x 

# split the first two sentences by the dot/question/exclamation. 
two_sentences = list(islice(multis('.?!',testline),2)) ## must save the result of generation 
print "result of split: ", two_sentences 

print '\n'.join(sentence.strip()+sep for sentence,sep in two_sentences) 
Powiązane problemy