Учитывая документ, выберите соответствующий фрагмент

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

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

Ответ 1

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

Похоже, вас интересует автоматическое суммирование текста. Для хорошего обзора проблемы, проблем и доступных алгоритмов взгляните на документ Das and Martin Обзор по автоматическому суммированию текста (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 для работы с текстом. В классификатор4J включен сумматор. Сумматор позволяет суммировать текст. Саммитатор действительно классный. Я не думаю, что есть какие-то другие java-компиляторы.

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

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

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

NClassifier (С#)

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

Сумматор Tristan Havelick для NLTK (Python)

Там находится незавершенный Python порт компилятора Classifier4J, построенный с помощью Python Набор инструментов Natural Language Toolkit (NLTK) здесь.