2010-05-13 6 views
10

Lorsque je pose une question ici, les astuces de la question renvoyée par la recherche automatique sont données au premier bit de la question, mais un pourcentage décent d'entre elles ne donne aucun texte cela est plus utile pour comprendre la question que le titre. Est-ce que quelqu'un a une idée sur la façon de faire un filtre pour couper les bits inutiles d'une question? Ma première idée est de découper toutes les phrases principales qui contiennent seulement des mots dans une liste (par exemple, les mots vides, plus les mots du titre, plus les mots du corpus SO qui ont une très faible corrélation avec les étiquettes, sont également susceptibles de se produire dans toute question indépendamment de celui-ci de tags)Étant donné un document, sélectionnez un extrait pertinent

+0

Copie possible de: ** [C# Recherche de fragments de document pertinents pour l'affichage des résultats de recherche] (http: // stackoverflow.com/questions/282002) ** – hippietrail

Répondre

16

texte automatique Summarization

On dirait que vous êtes intéressé par automatic text summarization. Pour un bon aperçu du problème, des problèmes rencontrés et des algorithmes disponibles, jetez un œil à l'article de Das et Martin A Survey on Automatic Text Summarization (2007).

algorithme simple

Un algorithme de compression simple mais assez efficace est de choisir juste un nombre limité de phrases du texte original qui contiennent des mots de contenu les plus fréquents (c.-à-les plus fréquents ne sont pas compris stop list mots).

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 

Certains paquets open source qui font en utilisant cet algorithme summarization sont:

Classifier4J (Java)

Si vous utilisez Java, vous pouvez utiliser le module de Classifier4JSimpleSummarizer.

En utilisant l'exemple trouvé here, supposons que le texte original est:

Classifier4J est un paquet java pour travailler avec le texte. Classifier4J inclut un synthétiseur. Un résumé permet le résumé du texte. Un Summariser est vraiment cool. Je ne pense pas qu'il existe d'autres synthétiseurs Java.

Comme on le voit dans l'extrait suivant, vous pouvez facilement créer un simple résumé d'une phrase:

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

En utilisant l'algorithme ci-dessus, cela produira Classifier4J includes a summariser..

NClassifier (C#)

Si vous utilisez C#, il y a un port de Classifier4J à C# appelé NClassifier

résumeur de Tristan Havelick pour NLTK (en Python)

Il y a un work-in-progress Port Python du synthétiseur de Classifier4J construit avec Natural Language Toolkit (NLTK) de Python disponible here.

+0

Je me demande si la version C# est assez rapide pour être utilisé pour ce site? – BCS

+0

L'algorithme est ** simple mort **, il devrait donc être assez rapide. Il détermine d'abord les ** mots de contenu les plus fréquents ** dans le texte original. Il itère ensuite sur eux et sélectionne la ** première phrase ** dans la chaîne d'origine qui contient chaque mot. Cela continue jusqu'à ce que le nombre souhaité de N phrases soit sélectionné. – dmcer

+0

J'ai récemment utilisé cet algorithme et je crois qu'il est vraiment facile à implémenter en C# et ça donne de bons résultats. J'avais besoin de jouer avec quelques paramètres ici et là, comme se débarrasser des espaces vides ou retourner des espaces clés. Cela prend quelques essais. Je vous remercie. –

Questions connexes