2010-07-25 8 views
5

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!)

+6

considérez comme « M. Rogers est allé au magasin. » : Est-ce 2 phrases? – unutbu

+0

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? –

+1

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

Répondre

10

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:

  1. Alors que la première solution vous permet de remplacer 2 avec un autre numéro pour choisir un autre nombre de phrases, dans la deuxième solution, vous modifiez le 1 {0,1} à un de moins que le nombre des phrases que vous voulez extraire.
  2. La seconde solution n'est pas aussi robuste dans la gestion, par exemple des chaînes vides, ou des chaînes sans ponctuation. Cela pourrait être fait, mais l'expression rationnelle serait encore plus complexe qu'elle ne l'est déjà, et je préférerais la première solution un peu moins efficace à un désordre illisible.
+0

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

+0

si «phrases» est la liste qui est retournée alors faites juste "". ".join (phrases)' pour l'obtenir comme une chaîne – aaronasterling

+0

@aaronasterling: J'ai modifié ma réponse pour conserver le ponctuation et rejoindre les phrases. –

1

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 ...

0

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.

+0

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

0

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 
0

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) 
Questions connexes