当我在这里提出问题时,自动搜索返回的问题的工具提示给出了问题的前一小部分,但是其中相当一部分没有给出比标题。有没有人知道如何制作过滤器以剔除无用的问题?
我的第一个想法是修剪任何仅包含某些列表中的单词的前导句子(例如,停用词,加上标题中的单词,加上与标签相关性非常弱的 SO 语料库中的单词,即同样可能无论标签如何,都会出现在任何问题中)
当我在这里提出问题时,自动搜索返回的问题的工具提示给出了问题的前一小部分,但是其中相当一部分没有给出比标题。有没有人知道如何制作过滤器以剔除无用的问题?
我的第一个想法是修剪任何仅包含某些列表中的单词的前导句子(例如,停用词,加上标题中的单词,加上与标签相关性非常弱的 SO 语料库中的单词,即同样可能无论标签如何,都会出现在任何问题中)
自动文本摘要
听起来您对自动文本摘要感兴趣。要对问题、涉及的问题和可用算法有一个很好的概述,请查看 Das 和 Martin 的论文A Survey on Automatic Text Summarization (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 允许对文本进行摘要。Summariser 真的很酷。我不认为有任何其他的 java 总结。
如以下代码段所示,您可以轻松创建一个简单的一句话摘要:
// Request a 1 sentence summary
String summary = summariser.summarise(longOriginalText, 1);
使用上面的算法,这将产生Classifier4J includes a summariser.
.
N分类器 (C#)
如果您使用的是 C#,则有一个 Classifier4J 到 C# 的端口,称为NClassifier
Tristan Havelick 的 NLTK 总结器(Python)
有一个使用 Python 的自然语言工具包 (NLTK)构建的 Classifier4J 总结器的正在进行中的 Python 端口,可在此处获得。