如何从文本文档中预测连续值(时间)?

时间:2013-02-26 10:57:32

标签: java python machine-learning classification regression

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

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

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

  1. 使用http://radimrehurek.com/gensim/simserver.html等技术构建类似文档的模型。当新文档到达时,可以尝试查找过去10个最相似的文档,并简单地计算其持续时间的平均值,并将该值作为新文档感兴趣的持续时间的预测。
  2. 将文件分为持续时间类别(例如1天,2天,3-5天,6-10天......)。然后训练分类器,根据文本内容预测持续时间的类别。
  3. 理念#1的优点是我还可以计算出我的预测的标准偏差,而对于理念#2,我不太清楚,我如何计算我的预测的不确定性的类似度量。另外我不清楚选择哪种类别从分类器中获得最佳结果。

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

2 个答案:

答案 0 :(得分: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)

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

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

答案 1 :(得分:1)

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

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

  

给定一组训练文件,设计一个评分系统   基于其内容的任意文档。

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

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

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

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

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

第一个选择是使用cosine similarity

tf-idf

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

如果你有大量的文档,你可以试试clustering来加快这个过程。

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

关于实施,请查看:Simple implementation of N-Gram, tf-idf and Cosine similarity in Python

(恕我直言,如果没有进一步了解其内容或内容与得分之间的关​​系,3000个文件的数量太少,无法做任何可靠的事情。)