La question d'un débutant Python:Limiter le nombre de phrases dans une chaîne
J'ai une chaîne avec x nombre de phrases. Comment puis-je extraire les 2 premières phrases (peut se terminer par .ou? Ou!)
La question d'un débutant Python:Limiter le nombre de phrases dans une chaîne
J'ai une chaîne avec x nombre de phrases. Comment puis-je extraire les 2 premières phrases (peut se terminer par .ou? Ou!)
Ignorant des considérations telles que lorsqu'un .
constitue la fin de la phrase:
import re
' '.join(re.split(r'(?<=[.?!])\s+', phrase, 2)[:-1])
EDIT: une autre approche qui vient de se produire pour moi est la suivante:
re.match(r'(.*?[.?!](?:\s+.*?[.?!]){0,1})', phrase).group(1)
Notes:
{0,1}
à un de moins que le nombre des phrases que vous voulez extraire.Merci, cela a fonctionné, même si elle a renvoyé une liste. J'ai essayé de le réintégrer dans une chaîne en utilisant une boucle for et en l'insérant manuellement. Sauf qu'il n'y en a pas? ou ! phrases dans mes chaînes plus :) – anroots
si «phrases» est la liste qui est retournée alors faites juste "". ".join (phrases)' pour l'obtenir comme une chaîne – aaronasterling
@aaronasterling: J'ai modifié ma réponse pour conserver le ponctuation et rejoindre les phrases. –
Je l'ai résolu comme ceci: Separating sentences, bien qu'un commentaire sur ce poste pointe également vers NLTK, bien que je ne sache pas comment trouver le phrase segmenteur sur leur site ...
Voilà comment yo pourrait le faire:
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]
Il y a probablement de meilleures façons, je me réjouis de les voir.
Ah, la solution de Marcelo est en effet bien meilleure. Je ne savais pas qu'il y avait une fonction de partage de regex. – TimCinel
Voici une explication étape par étape de la procédure de désassemblage, de sélection des deux premières phrases et de réassemblage. Comme mentionné par d'autres, cela ne tient pas compte du fait que tous les caractères points/questions/exclamations ne sont pas vraiment des séparateurs de phrases.
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
alternatif générateur utilisant ma fonction utilitaire morceau retour de chaîne jusqu'à ce que tout élément dans la séquence de recherche:
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)
considérez comme « M. Rogers est allé au magasin. » : Est-ce 2 phrases? – unutbu
Filtrez votre liste de phrases pour supprimer celles qui se terminent en une seule lettre ou avec des abréviations spécifiques, comme "Mr", "Mrs", "Ms", "Ltd", "etc", etc. Consultez une liste ou créez la vôtre . Certains sont indéterminés - par exemple, est "Masse". nécessairement une abréviation d'état? –
Quel problème essayez-vous de résoudre qui vous mène à cela? L'analyse syntaxique en langage naturel n'est pas pour les faibles de cœur, donc si vous pouvez mieux définir votre situation, vous pouvez obtenir des réponses plus utiles. – Daenyth