Así que he trabajado en NLP durante mucho tiempo, y este es un problema realmente difícil que está tratando de abordar. Nunca podrá implementar una solución con un 100% de precisión, por lo que debe decidir de antemano si es mejor tomar decisiones falsas negativas (no encontrar un punto de segmentación de párrafo) o falsas positivas (insertar una segmentación espuria) puntos). Una vez que lo haga, ensamble un corpus de documentos y anote los puntos de segmentación reales que espera encontrar.
Una vez que hayas hecho eso, necesitarás un mecanismo para encontrar los puntos EOS (final de la oración). Luego, entre cada par de oraciones, necesitarás tomar una decisión binaria: ¿debería insertarse un límite de párrafo aquí?
Puede medir la cohesión de conceptos dentro de cada párrafo en función de diferentes puntos de segmentación. Por ejemplo, en un documento con cinco frases (ABCDE), hay dieciséis maneras diferentes para segmentar que:
ABCDE ABCD|E ABC|DE ABC|D|E AB|CDE AB|CD|E AB|C|DE AB|C|D|E
A|BCDE A|BCD|E A|BC|DE A|BC|D|E A|B|CDE A|B|CD|E A|B|C|DE A|B|C|D|E
Para medir la cohesión, se puede utilizar una similitud-oración a oración métrica (basado en alguna colección de características extraídas para cada oración). En aras de la simplicidad, si dos oraciones adyacentes tienen una similitud de 0.95, entonces hay un "costo" de 0.05 para combinarlos en el mismo párrafo. El costo total de un plan de segmentación de documentos es el agregado de todos los costos de unión de oraciones. Para llegar a la segmentación final, elija el plan con el costo total más bajo.
Por supuesto, para un documento con más de unas pocas frases, hay demasiadas posibles permutaciones de segmentación diferentes a la fuerza bruta para evaluar todos sus costos. Entonces necesitarás algo de heurística para guiar el proceso. La programación dinámica podría ser útil aquí.
En cuanto a la extracción de la función de frase real ... bueno, ahí es donde se vuelve realmente complicado.
Probablemente desee ignorar palabras altamente sintácticas (palabras conjuntivas como preposiciones, conjunciones, verbos de ayuda y marcadores de cláusulas) y basar su similitud en palabras más semánticamente relevantes (sustantivos y verbos, y en menor medida, adjetivos y adverbios)
Una implementación ingenua podría simplemente contar el número de instancias de cada palabra y comparar los recuentos de palabras en una oración con los recuentos de palabras en una oración adyacente. Si aparece una palabra importante (como "Filadelfia") en dos oraciones adyacentes, es posible que obtengan una puntuación alta de similitud.
Pero el problema es que dos oraciones adyacentes pueden tener temas muy similares, incluso si esas oraciones tienen conjuntos de palabras que no se superponen por completo.
Por lo tanto, debe evaluar el "sentido" de cada palabra (su significado específico, dado el contexto circundante) y generalizar ese significado para abarcar un dominio más amplio.
Por ejemplo, representar una oración con la palabra "verdoso" en ella. Durante el proceso de extracción de mi característica, ciertamente incluiría el valor léxico exacto ("verdoso") pero también aplicaría una transformación morfológica, normalizando la palabra a su forma raíz ("verde"). Luego busco esa palabra en una taxonomía y descubro que es un color, que puede generalizarse más como un descriptor visual. Entonces, basado en esa palabra, podría agregar cuatro características diferentes a mi colección de características de oraciones ("verdoso", "verde", "[color]", "[visual]"). Si la siguiente oración en el documento se refiere al color "verde" de nuevo, entonces las dos oraciones serían muy similares. Si la siguiente oración usa la palabra "rojo", entonces todavía tienen un grado de similitud, pero en menor medida.
Entonces, hay algunas ideas básicas. Podría elaborar estos ad infinitum y modificar el algoritmo para obtener un buen rendimiento en su conjunto de datos específico. Hay un millón de formas diferentes de atacar este problema, pero espero que algunas de estas sugerencias sean útiles para comenzar.