Учитывая документ, выберите соответствующий фрагмент - PullRequest
10 голосов
/ 13 мая 2010

Когда я задаю вопрос здесь, всплывающие подсказки для вопроса, возвращаемого автоматическим поиском, дают первый маленький кусочек вопроса, но приличный процент из них не дает никакого текста, который более полезен для понимания вопрос, чем название. У кого-нибудь есть идея о том, как сделать фильтр, чтобы обрезать бесполезные кусочки вопроса?

Моя первая идея - обрезать любые начальные предложения, которые содержат только слова в некотором списке (например, стоп-слова, плюс слова из заголовка, плюс слова из корпуса SO, которые имеют очень слабую корреляцию с тегами, то есть одинаково вероятен в любом вопросе независимо от его тегов)

1 Ответ

16 голосов
/ 14 мая 2010

Автоматическое суммирование текста

Звучит так, будто вас интересует автоматическое суммирование текста . Хороший обзор проблемы, связанных с ней проблем и доступных алгоритмов можно найти в статье Даса и Мартина Обзор по автоматическому суммированию текста (2007).

Простой алгоритм

Простой, но достаточно эффективный алгоритм суммирования состоит в том, чтобы просто выбрать ограниченное количество предложений из исходного текста, которые содержат наиболее часто встречающиеся слова с содержанием (т. Е. Наиболее часто встречающиеся, не включающие стоп-лист слова).

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

Некоторые пакеты с открытым исходным кодом, которые выполняют суммирование с использованием этого алгоритма:

Classifier4J (Java)

Если вы используете Java, вы можете использовать Classifier4J модуль SimpleSummarizer .

Используя найденный пример здесь , давайте предположим, что оригинальный текст:

Classifier4J - это Java-пакет для работы с текстом. Classifier4J включает в себя сумматор. Summariser позволяет сводку текста. Подведение итогов действительно круто. Я не думаю, что есть какие-либо иные сумматоры Java.

Как видно из следующего фрагмента, вы можете легко создать простое резюме из одного предложения:

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

Используя приведенный выше алгоритм, вы получите Classifier4J includes a summariser..

N Классификатор (C #)

Если вы используете C #, есть порт Classifier4J - C #, называемый NClassifier

Подведение итогов Тристана Хавелика для NLTK (Python)

Имеется незавершенный порт Python для сумматора Classifier4J, созданный с использованием набора естественных языков (NLTK) Python доступен здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...