2010-05-13 8 views
10

Quando faccio una domanda qui, le descrizioni dei comandi per la questione restituito dalla ricerca automatica dato il primo po 'di domanda, ma una percentuale decente di loro non danno alcun testo questo è più utile per capire la domanda che il titolo. Qualcuno ha un'idea su come creare un filtro per ritagliare parti inutili di una domanda?Dato un documento, selezionare un frammento di rilevante

La mia prima idea è di tagliare qualsiasi frase iniziale che contiene solo parole in qualche elenco (per esempio, parole di fine, più parole del titolo, più parole del corpus SO che hanno una correlazione molto debole con i tag, cioè quella sono la stessa probabilità di verificarsi in ogni questione, indipendentemente della sua tag)

+0

Possibile duplicato di: ** [C# Ricerca di frammenti di documento rilevanti per visualizzazione risultati di ricerca] (http: // stackoverflow.it/questions/282002) ** – hippietrail

risposta

16

Testo automatico riepilogo

sembra che ti interessa automatic text summarization. Per una buona panoramica del problema, delle questioni coinvolte e degli algoritmi disponibili, date un'occhiata al documento di Das and Martin A Survey on Automatic Text Summarization (2007).

semplice algoritmo

Un algoritmo di riepilogo semplice ma ragionevolmente efficace è quello di selezionare solo un numero limitato di frasi dal testo originale che contengono le parole di contenuto più frequenti (ad esempio, quelle più frequenti che non includono stop list parole).

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 

Alcuni pacchetti open source che fanno riepilogo usando questo algoritmo sono:

Classifier4J (Java)

Se stai usando Java, è possibile utilizzare il modulo SimpleSummarizerClassifier4J s'.

Utilizzando l'esempio trovato here, supponiamo che il testo originale è:

Classifier4J è un pacchetto Java per lavorare con il testo. Classifier4J include un riepilogo. Un Summariser consente il riepilogo del testo. Un Summariser è davvero interessante. Non penso ci siano altri jaris summarisers.

Come si è visto nel seguente frammento di codice, è possibile creare facilmente un semplice riassunto una frase:

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

Usando l'algoritmo di cui sopra, questo produrrà Classifier4J includes a summariser..

NClassifier (C#)

Se stai usando C#, c'è un porto di Classifier4J a C# chiamato NClassifier

Summarizer di Tristan Havelick per NLTK (Python)

C'è un porta Python work-in-progress del classificatore di Classifier4J creato con Python Natural Language Toolkit (NLTK) disponibile here.

+0

Mi chiedo se la versione C# sia abbastanza veloce da essere utilizzata per questo sito? – BCS

+0

L'algoritmo è ** dead simple **, quindi dovrebbe essere abbastanza veloce. Determina innanzitutto le ** parole di contenuto più frequenti ** nel testo originale. Quindi itera su di loro e seleziona la ** frase meno recente ** nella stringa originale che contiene ogni parola. Questo continua fino a quando viene selezionato il numero desiderato di N molte frasi. – dmcer

+0

Recentemente ho usato questo algoritmo e credetemi è davvero facile da implementare in C# e dà buoni risultati. Avevo bisogno di giocare con alcune impostazioni qua e là come eliminare spazi vuoti o restituire spazi chiave. Ci vogliono un paio di tentativi. Grazie. –

Problemi correlati