Tengo un archivo de texto. Necesito obtener una lista de oraciones.
¿Cómo se puede implementar esto? Hay muchas sutilezas, como el uso de un punto en las abreviaturas.
Mi antigua expresión regular funciona mal:
re.compile('(\. |^|!|\?)([A-Z][^;↑\.<>@\^&/\[\]]*(\.|!|\?) )',re.M)
Respuestas:
El kit de herramientas de lenguaje natural ( nltk.org ) tiene lo que necesita. Esta publicación grupal indica que esto lo hace:
(¡No lo he probado!)
fuente
nltk .tokenize.punkt.PunktSentenceTokenizer
.nltk.download()
primero y descargar modelos ->punkt
'This fails on cases with ending quotation marks. If we have a sentence that ends like "this." This is another sentence.'
y mi salida['This fails on cases with ending quotation marks.', 'If we have a sentence that ends like "this."', 'This is another sentence.']
parece correcta para mí.Esta función puede dividir todo el texto de Huckleberry Finn en oraciones en aproximadamente 0.1 segundos y maneja muchos de los casos extremos más dolorosos que hacen que el análisis de oraciones no sea trivial, por ejemplo, "El Sr. John Johnson Jr. nació en los EE. UU. Pero obtuvo su Ph. D. en Israel antes de unirse a Nike Inc. como ingeniero. También trabajó en craigslist.org como analista de negocios " .
fuente
prefixes = "(Mr|St|Mrs|Ms|Dr|Prof|Capt|Cpt|Lt|Mt)[.]"
,websites = "[.](com|net|org|io|gov|me|edu)"
yif "..." in text: text = text.replace("...","<prd><prd><prd>")
En lugar de usar expresiones regulares para dividir el texto en oraciones, también puede usar la biblioteca nltk.
ref: https://stackoverflow.com/a/9474645/2877052
fuente
for sentence in tokenize.sent_tokenize(text): print(sentence)
Puede intentar usar Spacy en lugar de regex. Lo uso y hace el trabajo.
fuente
Este es un enfoque intermedio que no depende de bibliotecas externas. Utilizo la comprensión de listas para excluir superposiciones entre abreviaturas y terminadores, así como para excluir superposiciones entre variaciones en terminaciones, por ejemplo: '.' vs. '. "'
Usé la función find_all de Karl de esta entrada: Encuentra todas las apariciones de una subcadena en Python
fuente
...
y?!
.Para casos simples (donde las oraciones terminan normalmente), esto debería funcionar:
La expresión regular es
*\. +
, que coincide con un punto rodeado por 0 o más espacios a la izquierda y 1 o más a la derecha (para evitar que algo como el punto en re.split se cuente como un cambio en la oración).Obviamente, no es la solución más sólida, pero funcionará bien en la mayoría de los casos. El único caso que esto no cubrirá son las abreviaturas (¿tal vez revise la lista de oraciones y verifique que cada cadena
sentences
comience con una letra mayúscula?)fuente
SyntaxError: EOL while scanning string literal
apuntando al paréntesis de cierre (despuéstext
). Además, la expresión regular a la que hace referencia en su texto no existe en su ejemplo de código.r' *[\.\?!][\'"\)\]]* +'
También puede utilizar la función de tokenización de frases en NLTK:
fuente
@Artyom,
¡Hola! Puede crear un nuevo tokenizador para ruso (y algunos otros idiomas) usando esta función:
y luego llámalo de esta manera:
Buena suerte, Marilena.
fuente
Sin duda, NLTK es el más adecuado para este propósito. Pero comenzar con NLTK es bastante doloroso (pero una vez que lo instalas, solo cosechas las recompensas)
Así que aquí hay un código re basado simple disponible en http://pythonicprose.blogspot.com/2009/09/python-split-paragraph-into-sentences.html
fuente
Tuve que leer archivos de subtítulos y dividirlos en oraciones. Después del preprocesamiento (como eliminar información de tiempo, etc. en los archivos .srt), la variable fullFile contenía el texto completo del archivo de subtítulos. La siguiente manera cruda los dividió cuidadosamente en oraciones. Probablemente tuve suerte de que las frases siempre terminaran (correctamente) con un espacio. Pruebe esto primero y, si tiene alguna excepción, agregue más controles y equilibrios.
Oh! bien. Ahora me doy cuenta de que, dado que mi contenido era español, no tuve problemas con el "Sr. Smith", etc. Aún así, si alguien quiere un analizador rápido y sucio ...
fuente
Espero que esto te ayude con el texto latino, chino y árabe.
fuente
salida:
Fuente: https://www.geeksforgeeks.org/nlp-how-tokenizing-text-sentence-words-works/
fuente