2010-05-13 26 views
10

Burada bir soru sorduğumda, sorgunun ilk küçük biti verilen otomatik arama tarafından döndürülen soru için araç ipuçları, ancak bunların iyi bir yüzdesi hiçbir metin vermez Bu soru, başlığı anlamaktan daha yararlıdır. Bir sorunun yararsız bitlerini düzeltmek için nasıl bir filtre yapılacağı hakkında bir fikri olan var mı?Bir belge verildiğinde, ilgili bir parçacık seçin

İlk düşüncem, yalnızca bazı kelimelerdeki sözcükleri içeren öntanımlı tümcecik parçaları kesmek (örneğin, sözcükleri durdurmak, başlıktan sözcükler, artı etiketlerle çok zayıf bir korelasyona sahip SO corpus sözcükleri)) bakılmaksızın 's etiketleri herhangi bir soru ortaya olasılıklarının eşit

+0

Muhtemel kopyası: ** [C# Arama Sonucu Ekranına İlişkin Belge Parçacıkları Bulma] (http: // stackoverflow.com/questions/282002) ** – hippietrail

cevap

16

Otomatik Metin Özetleme Eğer automatic text summarization ilgilendiğiniz gibi geliyor

. Sorunun, ilgili konuların ve mevcut algoritmaların güzel bir genel görünümü için, Das ve Martin'in gazetesine bir göz atın. A Survey on Automatic Text Summarization (2007).

Basit Algoritma

Basit ama oldukça etkili özetleme algoritması sadece yani en sık olanları stop list kelime hariç en sık içerik sözcükleri içeren orijinal metinle (den cümle sınırlı sayıda seçmektir).

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 

bu algoritma kullanılarak özetleme yapmak Bazı açık kaynak paketleri

şunlardır:

Classifier4J (Java)

Java kullanıyorsanız, sen Classifier4J 'ın modülünü SimpleSummarizer kullanabilirsiniz.

Classifier4J metin üzerinde çalışmak için bir java paketi: örneği kullanarak

orijinal metindir varsayalım here bulundu. Classifier4J bir özetleyici içerir. Bir Özetleyici, metnin özetini sağlar. Bir Summariser gerçekten harika. Başka java summariserleri olduğunu sanmıyorum. Aşağıdaki kod parçasında görüldüğü gibi

, kolayca basit bir cümle özetini oluşturabilir: Yukarıdaki algoritma kullanılarak

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

, bu Classifier4J includes a summariser. üretecek.

NClassifier (C#)

C# kullanıyorsanız, C# için Classifier4J bir liman var denilen NClassifier

NLTK için Tristan Havelick en Summarizer (Python)

var bir Python'un Natural Language Toolkit (NLTK) mevcut here ile inşa edilmiş Classifier4J'nin özetleyicisinin Python portu.

+0

C# versiyonu bu site için kullanılacak kadar hızlı olup olmadığını merak ediyorum? – BCS

+0

Algoritma ** ölü basit **, yani gerçekten yeterince hızlı olmalı. İlk önce orijinal metinde ** en sık kullanılan içerik kelimelerini ** belirler. Daha sonra bunların üzerine yinelenir ve her kelimeyi içeren orijinal dizede ** en erken cümle ** yi seçer. Bu, istenen sayıda N cümlesi seçilinceye kadar devam eder. – dmcer

+0

Son zamanlarda bu algoritmayı kullandım ve C# 'da uygulanmasının gerçekten çok kolay olduğunu ve iyi sonuçlar verdiğini düşünüyorum. Burada boş yerlerden kurtulmak veya anahtar boşlukları geri almak gibi bir kaç ayar yapmam gerekiyor. Birkaç denemeye ihtiyaç var. Teşekkür ederim. –

İlgili konular