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

Posted

技术标签:

【中文标题】如何从文本文档中预测连续值(时间)? [关闭]【英文标题】:How to predict a continuous value (time) from text documents? [closed] 【发布时间】:2013-02-11 19:09:10 【问题描述】:

我有大约 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),则会给予奖励。

【问题讨论】:

@larsmans:为什么一方面你给出了这个问题的答案,但另一方面你投票支持这个问题作为离题结束? 【参考方案1】:

方法(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)起一个名字:k-最近邻回归。这对我很有帮助。【参考方案2】:

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

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

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

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

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

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

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

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

第一个选择是使用tf-idf 的cosine similarity

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

如果您有大量文档,可以尝试clustering 来加快处理速度。

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

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

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

【讨论】:

以上是关于如何从文本文档中预测连续值(时间)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java + 正则表达式从文本文档中提取 URL

labview如何读取文本文档中某一行的字符串

使用 Wordnet 进行概念提取

如何在我的不和谐机器人上实时显示来自文件(文本)的信息

从文本区域获取文本时如何保留换行符?

从文本文档图像中提取文本检测特征