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!)
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!)
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:
{0,1}
a uno menos que el número de de oraciones que quieres extraerGracias, 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
if 'oraciones' es la lista que se devuelve entonces simplemente haz' "." unir (oraciones) 'para obtenerlo como una cadena – aaronasterling
@aaronasterling: He modificado mi respuesta para conservar el puntuación y volver a unir las oraciones. –
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 ...
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.
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
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
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)
considerar "Sr. Rogers fue a la tienda." : ¿Son 2 oraciones? – unutbu
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? –
¿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