2010-05-13 11 views
10

Wenn ich hier eine Frage stelle, gibt das Tool Tipps für die Frage von der automatischen Suche gegeben das erste bisschen der Frage, aber ein anständiger Prozentsatz von ihnen geben keinen Text das ist für das Verständnis der Frage nützlicher als der Titel. Hat jemand eine Idee darüber, wie man einen Filter macht, um nutzlose Bits einer Frage auszublenden?Gegeben ein Dokument, wählen Sie ein relevantes Snippet

Meine erste Idee ist es, alle führenden Sätze zu trimmen, die nur Wörter in einer Liste enthalten (z. B. Stoppwörter, Wörter aus dem Titel und Wörter aus dem SO-Korpus, die eine sehr schwache Korrelation mit Tags haben) sind gleich wahrscheinlich in jeder Frage treten, unabhängig von Tags) es ist

+0

Mögliches Duplikat von: ** [C# Relevante Dokument-Snippets für Suchergebnisanzeige finden] (http: // stackoverflow.com/questions/282002) ** – hippietrail

Antwort

16

Automatische Textzusammenfassungs

es klingt wie Sie in automatic text summarization interessiert sind. Einen schönen Überblick über das Problem, die damit verbundenen Probleme und verfügbaren Algorithmen finden Sie in Das und Martin's Paper A Survey on Automatic Text Summarization (2007).

einfachen Algorithmus

Eine einfache, aber einigermaßen effektiv Verdichtungsalgorithmus ist nur eine begrenzte Anzahl von Sätzen aus dem ursprünglichen Text auswählen, die die häufigsten Inhaltswörter enthalten (dh die häufigsten diejenigen, einschließlich nicht stop list Worte).

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 

Einige Open-Source-Pakete, die Verdichtung mit diesem Algorithmus zu tun sind:

Classifier4J (Java)

Wenn Sie Java verwenden, Sie Classifier4J ‚s Modul SimpleSummarizer verwenden können.

das Beispiel Verwendung gefunden here, lassen vermuten, ist der ursprüngliche Text ist:

Classifier4J ist ein Java-Paket für die Arbeit mit Text. Classifier4J enthält einen Zusammenfasser. Ein Summariser erlaubt die Zusammenfassung von Text. Ein Summariser ist wirklich cool. Ich glaube nicht, dass es andere Java-Zusammenfassungen gibt.

Wie im folgenden Ausschnitt zu sehen, Sie leicht einen einfachen Satz Zusammenfassung erstellen:

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

den Algorithmus oben verwenden, wird diese Classifier4J includes a summariser. produzieren.

NClassifier (C#)

Wenn Sie C# verwenden, gibt es einen Hafen von Classifier4J zu C# NClassifier

genannt

Tristan Havelick des Zusammenfasser für NLTK (Python)

Es gibt eine Work-in-Progress-Python-Port von Classifier4Js Zusammenfassung, die mit Pythons Natural Language Toolkit (NLTK) verfügbar here erstellt wurde.

+0

Ich frage mich, ob die C# Version schnell genug ist, um für diese Seite verwendet zu werden? – BCS

+0

Der Algorithmus ist ** tot einfach **, also sollte es wirklich schnell genug sein. Es ermittelt zuerst die ** häufigsten Inhaltswörter ** im Originaltext. Es iteriert dann über sie und wählt den ** frühesten Satz ** in der ursprünglichen Zeichenfolge aus, die jedes Wort enthält. Dies wird fortgesetzt, bis die gewünschte Anzahl von N vielen Sätzen ausgewählt ist. – dmcer

+0

Ich habe diesen Algorithmus kürzlich verwendet und glaube mir, dass er in C# sehr einfach zu implementieren ist und gute Ergebnisse liefert. Ich musste hier und da mit ein paar Einstellungen herumspielen, wie zum Beispiel leeren Räumen oder Schlüsselräumen. Es dauert ein paar Versuche. Vielen Dank. –