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
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
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:
{0,1}
jeden mniejsza od liczby zdań, które chcesz wyodrębnić.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
jeśli 'zdanie' jest listą, która zostanie zwrócona to po prostu zrób' "." .join (zdania) ', aby uzyskać ją jako ciąg – aaronasterling
@onarasterling: Zmieniłem moją odpowiedź, aby zachować interpunkcja i powróć do zdań. –
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 ...
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.
Ah, rozwiązanie Marcelo jest znacznie lepsze. Nie wiedziałem, że istnieje funkcja podziału regex. – TimCinel
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
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)
Rozważmy : Czy to 2 zdania? – unutbu
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? –
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