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

6 投票
2 回答
3840 浏览
提问于 2025-04-17 17:10

我有大约3000个文本文件,这些文件与它们被认为“有趣”的时间段有关。比如说,文档1有300行内容,它的有趣时间是5.5天,而另一个只有40行的文档,它的有趣时间是6.7天,依此类推。

现在我的任务是根据文本内容来预测这个有趣的时间段(这是一个连续的数值)。

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

  1. 建立一个类似文档的模型,使用像http://radimrehurek.com/gensim/simserver.html这样的技术。当有新文档到来时,可以尝试找到过去10个最相似的文档,然后计算它们的有趣时间的平均值,把这个值作为新文档的预测时间。
  2. 把文档分成不同的时间段类别(例如:1天、2天、3-5天、6-10天等)。然后训练一个分类器,根据文本内容来预测这个时间段的类别。

第一个想法的好处是,我还可以计算预测的标准差,而第二个想法让我不太清楚如何计算类似的预测不确定性。此外,我也不太确定应该选择哪些类别才能让分类器得到最佳结果。

所以有没有什么简单的规则可以帮助我建立一个系统,从文本文件中最好地预测像时间这样的连续值?应该使用分类器,还是用类似文档的平均值的方法?我在这方面没有太多经验,想知道你认为哪种方法可能会得到最佳结果。如果你知道一个简单的现有技术(基于Java或Python),可以用来解决这个问题,那就更好了。

2 个回答

1

(以下内容是基于我的学术“经验”,但看起来足够有信息量,可以分享出来。)

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

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

“根据内容”这个说法很模糊。实际上,我觉得它太模糊了。你可以尝试找出这些文档中某些特征,这些特征似乎与评分有关。这更像是一个人类的任务,直到你能缩小范围,比如你知道你在寻找某些“有价值”的词汇,这些词汇构成了评分,或者可能是一些词组(可以看看这个链接)。

你也可以尝试开发一个类似搜索引擎的系统,基于相似度的计算,sim(doc1, doc2)。不过,你需要一个包含所有可能评分的大数据集(从最低到最高,重复多次),这样对于每个输入文档,才有可能存在相似的文档。否则,结果可能会不太明确。

根据sim()返回的值,这个相似度应该满足某种关系,比如:

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

为了测试这个相似度的质量,你可以计算每对文档的相似度和评分差异,然后检查一下相关性

首先可以考虑使用余弦相似度,结合tf-idf

你还提到过对数据进行分类。在我看来,这似乎是一种“为”一个糟糕的相似度度量辩护的方法。也就是说,如果这个度量好,那么应该很清楚文档会属于哪个类别。至于分类器,你的文档首先应该定义一些“特征”。

如果你有大量的文档数据,你可以尝试聚类来加快处理速度。

最后,为了确定最终的评分,我建议处理几个最相似文档的评分。简单取平均可能不是最好的主意,因为“相似度低”也意味着“准确度低”。

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

(在我看来,3000个文档对于在没有进一步了解其内容或内容与评分之间关系的情况下,做任何可靠的事情来说,数量实在是太少了。)

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)

这就是一个简单的线性回归。实际上,我认为兴趣持续时间不太可能是文本内容的线性函数,但这可以帮助你入门。下一步就是找一本关于机器学习或统计学的教科书,学习更高级的回归模型。

(*) 我是这个项目的贡献者,所以这并不是完全客观的建议。几乎任何一个不错的机器学习工具包都有线性回归模型。

撰写回答