给定一篇文档,选择一个相关的片段。

10
当我在这里提问时,自动搜索返回的问题工具提示根据问题的开头给出了一些提示,但相当大比例的提示并没有提供任何更有用的文本来理解问题。是否有人有关于如何过滤掉问题中无用部分的想法?
我的第一个想法是去除包含某个列表中仅包含单词(例如停用词、标题中的单词以及SO语料库中与标签弱相关的单词,即出现在任何问题中的可能性相等,而不受其标签的影响)的前置句子。

可能是重复的问题:**C#查找相关文档片段以用于搜索结果显示** - hippietrail
1个回答

16

自动文本摘要

听起来你对自动文本摘要很感兴趣。如果想了解该问题的概述、相关问题以及可用算法,请查看Das和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

使用在 here 找到的示例,假设原始文本为:

Classifier4J是一个用于处理文本的Java软件包。 Classifier4J包括一个摘要生成器。 摘要生成器允许对文本进行摘要。 摘要生成器非常酷。 我想没有其他Java摘要生成器了。

如下代码片段所示,您可以轻松创建一个简单的一句话摘要:

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

使用上述算法,这将产生Classifier4J 包括一个摘要器。NClassifier(C#) 如果您使用的是 C#,那么有一个名为NClassifier的 Classifier4J 的 C# 移植版可用。 Tristan Havelick's Summarizer for NLTK(Python) 有一个正在进行中的 Python 移植版本 Classifier4J 的摘要器,使用了 Python 的 自然语言工具包(NLTK),可在此处 here 获取。

我想知道C#版本是否足够快,可以用于这个网站吗? - BCS
该算法非常简单,因此应该足够快。它首先确定原始文本中的最常见内容单词。然后迭代这些单词,并选择包含每个单词的原始字符串中最早的句子。这将继续进行,直到选择了所需数量的N个句子。 - dmcer
我最近使用了这个算法,相信我,在C#中实现它真的很容易,并且它确实能够给出良好的结果。我需要在一些设置上进行调整,例如去除空格或回车键空格等。需要尝试几次。谢谢。 - Karim O.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接