5

我有大约 3000 个文本文档,这些文档与文档“有趣”的持续时间有关。因此,假设文档 1 有 300 行带有内容的文本,这导致感兴趣的持续时间为 5.5 天,而另一个具有 40 行文本的文档导致 6.7 天的持续时间是“有趣的”,依此类推。

现在的任务是根据文本内容预测感兴趣的持续时间(这是一个连续值)。

我有两个想法来解决这个问题:

  1. 使用http://radimrehurek.com/gensim/simserver.html之类的技术构建类似文档的模型。当一个新文档到达时,可以尝试找到过去 10 个最相似的文档,并简单地计算它们的持续时间的平均值,并将该值作为对新文档感兴趣的持续时间的预测。
  2. 将文件按持续时间分类(例如 1 天、2 天、3-5 天、6-10 天……)。然后训练一个分类器根据文本内容预测持续时间的类别。

想法 #1 的优点是我还可以计算预测的标准偏差,而对于想法 #2,我不太清楚如何计算类似的预测不确定性度量。我也不清楚选择哪些类别才能从分类器中获得最佳结果。

那么是否有经验法则如何构建一个系统来最好地预测文本文档中的连续值(如时间)?应该使用分类器还是应该使用在相似文档上使用平均值的方法?我在这方面没有真正的经验,我想知道,您认为哪种方法可能会产生最好的结果。如果您知道可用于解决此问题的简单现有技术(基于 Java 或 Python),则会给予奖励。

4

2 回答 2

3

方法(1)称为k-最近邻回归。这是完全有效的。无数其他回归方法也是如此,例如使用文档的标记作为特征的简单多元回归。

这是使用scikit-learn (*)拟合线性回归模型的骨架脚本:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import SGDRegressor

# build a term-document matrix with tf-idf weights for the terms
vect = TfidfVectorizer(input="filename")
Xtrain = vect.fit_transform(documents)         # documents: list of filenames

# now set ytrain to a list of durations, such that ytrain[i] is the duration
# of documents[i]
ytrain = ...

# train a linear regression model using stochastic gradient descent (SGD)
regr = SGDRegressor()
regr.fit(Xtrain, ytrain)

而已。如果您现在有要预测感兴趣持续时间的新文档,请执行

Xtest = vect.transform(new_documents)
ytest = regr.predict(Xtest)

这是一个简单的线性回归。实际上,我希望兴趣持续时间不是文本内容的线性函数,但这可能会让您入门。下一步将是拿起任何关于机器学习或统计学的教科书,这些教科书可以处理更高级的回归模型。

(*) 我是这个项目的贡献者,所以这不是公正的建议。几乎任何半体面的机器学习工具包都有线性回归模型。

于 2013-02-26T12:59:54.797 回答
1

(以下内容基于我的学术“经验”,但似乎信息量足以发布)。

看起来您的任务可以重新表述为:

给定一组评分文档的训练集,设计一个系统,根据其内容对任意文档进行评分。

“基于他们的内容”是很模棱两可的。事实上,我会说这太模棱两可了。您可以尝试找到那些似乎对分数负责的文档的特定特征。在您缩小范围之前,这更像是一项人工任务,例如,您知道您正在寻找构成分数的某些“有价值”的词,或者可能是词组(查看http://en.wikipedia. org/wiki/N-gram)。

您也可以尝试基于相似性度量开发类似搜索引擎的系统,sim(doc1, doc2). 但是,您需要一个包含所有可能分数(从最低到最高,多次)的大型语料库,因此对于每个输入文档,类似的文档都有机会存在。否则,结果将是不确定的。

根据 sim() 将返回的值,该度量应满足如下关系:

sim(doc1,doc2) == 1.0 - |score(doc1) - score(doc2)|.

要测试度量的质量,您可以计算每对文档的相似性和得分差异,并检查相关性

第一个选择是使用tf-idf的余弦相似度

您还提到了对数据进行分类。在我看来,这似乎是一种“证明”较差的相似性度量的方法。即,如果衡量标准是好的,那么应该清楚文档将属于哪个类别。至于分类器,您的文档应该首先定义一些“特征”。

如果你有大量的文档,你可以尝试集群来加速这个过程。

最后,为了确定最终分数,我建议处理一些最相似的文档的分数。在这种情况下,原始平均值可能不是最好的主意,因为“不太相似”也意味着“不太准确”。

至于实现,请看:Python 中 N-Gram、tf-idf 和余弦相似度的简单实现

(恕我直言,在不进一步了解其内容或内容与分数之间的关系的情况下,3000 个文档的数量太少了,无法用它做任何可靠的事情。)

于 2013-02-26T12:57:27.563 回答