2010-07-25 21 views
5

Pregunta de Python para principiantes:Limite el número de oraciones en una cadena

Tengo una cadena con x número de oraciones. Cómo extraer las primeras 2 oraciones (puede terminar con. O? O!)

+6

considerar "Sr. Rogers fue a la tienda." : ¿Son 2 oraciones? – unutbu

+0

Filtre su lista de oraciones para eliminar aquellas que terminan en letras simples o con abreviaturas específicas, como "Señor", "Señora", "Ms", "Ltd", "etc.", etc. Consulte una lista o haga su propia . Algunos son indeterminados; por ejemplo, es "Misa". necesariamente una abreviatura del estado? –

+1

¿Qué problema estás tratando de resolver que te está conduciendo a esto? El análisis de lenguaje natural no es para cardíacos, por lo que si puede definir mejor su situación, puede obtener respuestas más útiles. – Daenyth

Respuesta

10

Haciendo caso omiso de consideraciones tales como cuando un . constituye el final de la frase:

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

EDIT: Otro enfoque que se me acaba de ocurrir es la siguiente:

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

Notas:

  1. Mientras que la primera solución le permite reemplazar el 2 con algún otro número para elegir un número diferente de frases, en la segunda solución, se cambia el 1 de {0,1} a uno menos que el número de de oraciones que quieres extraer
  2. La segunda solución no es tan robusta en el manejo, por ejemplo, cadenas vacías o cadenas sin puntuación. Podría hacerse así, pero la expresión regular sería aún más compleja de lo que ya es, y yo preferiría la primera solución ligeramente menos eficiente que un lío ilegible.
+0

Gracias, eso funcionó, aunque devolvió una lista. Traté de volver a ponerlo en una cadena usando un bucle e insertando manualmente. Excepto que no hay? o! oraciones en mis cadenas más :) – anroots

+0

if 'oraciones' es la lista que se devuelve entonces simplemente haz' "." unir (oraciones) 'para obtenerlo como una cadena – aaronasterling

+0

@aaronasterling: He modificado mi respuesta para conservar el puntuación y volver a unir las oraciones. –

1

Lo resolví así: Separating sentences, aunque un comentario en esa publicación también apunta a NLTK, aunque no sé cómo encontrar el segmentación de condena en su sitio ...

0

Así es como yo podría hacerlo:

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] 

probablemente hay mejores maneras, espero verlos.

+0

Ah, la solución de Marcelo es de hecho mucho mejor. No sabía que había una función de división de expresiones regulares. – TimCinel

0

Aquí hay una explicación paso a paso sobre cómo desensamblar, elegir las dos primeras oraciones y volver a montarlo. Como notaron otros, esto no toma en cuenta que no todos los caracteres de punto/pregunta/exclamación son realmente separadores de oraciones.

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

alternativa Generador usando mi función de utilidad volver trozo de cuerda hasta cualquier punto en la secuencia de búsqueda:

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) 
Cuestiones relacionadas