2010-05-13 12 views
10

Cuando hago una pregunta aquí, la herramienta da un consejo para la pregunta devuelta por la búsqueda automática dada la primera parte de la pregunta, pero un porcentaje decente de ellos no da ningún texto eso es más útil para entender la pregunta que el título. ¿Alguien tiene una idea sobre cómo hacer un filtro para recortar bits inútiles de una pregunta?Dado un documento, seleccione un fragmento relevante

Mi primera idea es recortar las oraciones iniciales que contengan solo palabras en una lista (por ejemplo, palabras para detener, más palabras del título, más palabras del corpus SO que tienen una correlación muy débil con las etiquetas, es decir son la misma probabilidad de ocurrir en cualquier cuestión, independientemente de tI de etiquetas)

+0

Posible duplicado de: ** [C# Encontrar fragmentos de documentos relevantes para la pantalla de resultados de búsqueda] (http: // stackoverflow.com/questions/282002) ** – hippietrail

Respuesta

16

texto resumen automático

parece que usted está interesado en automatic text summarization. Para obtener una buena visión general del problema, los problemas involucrados y los algoritmos disponibles, consulte el documento de Das y Martin A Survey on Automatic Text Summarization (2007).

simple algoritmo

Un simple pero razonablemente eficaz algoritmo de resumen implica elegir un número limitado de frases del texto original que contiene las palabras de contenido más frecuentes (es decir, las más frecuentes sin incluir stop list palabras)

Summarizer(originalText, maxSummarySize): 
    // start with the raw freqs, e.g. [(10,'the'), (3,'language'), (8,'code')...] 
    wordFrequences = getWordCounts(originalText) 
    // filter, e.g. [(3, 'language'), (8, 'code')...] 
    contentWordFrequences = filtStopWords(wordFrequences) 
    // sort by freq & drop counts, e.g. ['code', 'language'...] 
    contentWordsSortbyFreq = sortByFreqThenDropFreq(contentWordFrequences) 

    // Split Sentences 
    sentences = getSentences(originalText) 

    // Select up to maxSummarySize sentences 
    setSummarySentences = {} 
    foreach word in contentWordsSortbyFreq: 
     firstMatchingSentence = search(sentences, word) 
     setSummarySentences.add(firstMatchingSentence) 
     if setSummarySentences.size() = maxSummarySize: 
     break 

    // construct summary out of select sentences, preserving original ordering 
    summary = "" 
    foreach sentence in sentences: 
    if sentence in setSummarySentences: 
     summary = summary + " " + sentence 

    return summary 

Algunos paquetes de código abierto que hacen uso de este algoritmo de resumen son:

Classifier4J (Java)

Si está utilizando Java, se puede utilizar Classifier4J 's módulo de SimpleSummarizer.

Usando el ejemplo encontró here, asumamos que el texto original es:

Classifier4J es un paquete de Java para trabajar con texto. Classifier4J incluye un resumen. Un resumidor permite el resumen del texto. Un Summariser es realmente genial. No creo que haya ningún otro sumario de Java.

Como se ve en el siguiente fragmento, se puede crear fácilmente un simple resumen de una frase:

// Request a 1 sentence summary 
String summary = summariser.summarise(longOriginalText, 1); 

Usando el algoritmo anterior, esto producirá Classifier4J includes a summariser..

NClassifier (C#)

Si estás usando C#, hay un puerto de Classifier4J a C# llamado NClassifier

Resumidor de Tristan Havelick para NLTK (Python)

Hay una puerto en progreso de Python del clasificador de 4J de Classifier construido con Python's Natural Language Toolkit (NLTK) disponible here.

+0

Me pregunto si la versión C# es lo suficientemente rápida como para ser utilizada en este sitio. – BCS

+0

El algoritmo es ** dead simple **, por lo que realmente debería ser lo suficientemente rápido. Primero determina las ** palabras de contenido más frecuentes ** en el texto original. Luego itera sobre ellos y selecciona la ** oración más temprana ** en la cadena original que contiene cada palabra. Esto continúa hasta que se selecciona el número deseado de N muchas oraciones. – dmcer

+0

Recientemente utilicé este algoritmo y creo que es realmente fácil de implementar en C# y da buenos resultados. Necesitaba jugar con algunas configuraciones aquí y allá, como deshacerse de espacios vacíos o devolver espacios clave. Se necesita un par de intentos. Gracias. –

Cuestiones relacionadas