我有大约3000份文本文档,这些文档与文档被认为“有趣”的时间段有关。例如,文档1有300行的文本内容,导致了5.5天的兴趣持续时间,而另一份有40行文本的文档则导致了6.7天的“有趣”持续时间,依此类推。
现在,任务是从文本内容预测兴趣持续时间(这是一个连续值)。
我有两个想法来解决这个问题:
- 使用像http://radimrehurek.com/gensim/simserver.html这样的技术构建相似文档的模型。当有新文档到达时,可以尝试找到过去10个最相似的文档,然后计算它们的持续时间的平均值,并将该值作为新文档兴趣持续时间的预测值。
- 将文档按持续时间分类(例如,1天,2天,3-5天,6-10天,…)。然后训练一个分类器,根据文本内容预测持续时间的类别。
想法#1的优势是我还可以计算预测的标准偏差,而对于想法#2,我不太清楚如何计算类似的预测不确定性度量。此外,我不清楚选择哪些类别才能从分类器中获得最佳结果。
那么,有没有关于如何构建系统以最佳方式从文本文档中预测像时间这样的连续值的经验法则?是应该使用分类器,还是应该使用基于相似文档的平均值的方法?我在这方面没有实际经验,想知道您认为哪种方法可能会产生最佳结果。如果您知道一个简单的现有技术(基于Java或Python),可以用来解决这个问题,将会是额外的加分项。
回答:
方法(1)被称为k-最近邻回归。这是完全有效的。还有许多其他回归方法,例如使用文档的标记作为特征的普通多元回归。
以下是一个使用scikit-learn拟合线性回归模型的骨架脚本:
from sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.linear_model import SGDRegressor# 使用tf-idf权重构建术语-文档矩阵vect = TfidfVectorizer(input="filename")Xtrain = vect.fit_transform(documents) # documents: 文件名列表# 现在将ytrain设置为持续时间列表,使ytrain[i]是documents[i]的持续时间ytrain = ...# 使用随机梯度下降(SGD)训练线性回归模型regr = SGDRegressor()regr.fit(Xtrain, ytrain)
就这样。如果您现在有新的文档想要预测兴趣持续时间,可以执行以下操作:
Xtest = vect.transform(new_documents)ytest = regr.predict(Xtest)
这是一个简单的线性回归。实际上,我预计兴趣持续时间不会是文本内容的线性函数,但这可能是一个起点。下一步是选择任何一本讨论更高级回归模型的机器学习或统计学教科书。
(*) 我是这个项目的贡献者,所以这不是无偏见的建议。几乎任何半 decent 的机器学习工具包都有线性回归模型。