2013-02-26 36 views
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),則會給出獎勵點。

+0

@larsmans:爲什麼一方面你對這個問題給出了答案,另一方面你對這個問題投了贊成票作爲題外話? – asmaier 2013-02-26 15:03:05

回答

1

(以下是基於我的學術「經驗」,但似乎足夠內容足以張貼它)。

它看起來像你的任務可以被改寫爲:

給定的訓練集評分的文檔,設計一個系統得分基於其內容 任意文件。

「根據他們的內容」是非常模糊的。事實上,我會說這太模糊了。 您可以嘗試查找這些文件的某個特定功能,這些文檔似乎對評分負責。除非你能縮小範圍,否則它更像是一項人工任務。你知道你正在尋找組成分數的某些「有價值的」單詞,或者是單詞組(看看http://en.wikipedia.org/wiki/N-gram)。

您也可以嘗試基於相似性度量sim(doc1, doc2)開發類似搜索引擎的系統。但是,您需要一個包含所有可能分數(從最低到最高,多次)的大型語料庫,因此對於每個輸入文檔,類似的文檔都有機會存在。否則,結果會不一致。

取決於什麼樣的價值觀SIM()將返回,這項措施應fullfill像一個關係:

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

爲了測試測量的質量,你可以計算出相似度評分差值爲每對ducuments的,並檢查correlation

挑頭將使用tf-idf

你也提到分類數據是cosine similarity。在我看來,這似乎是一種「證明」相似性差的措施。即如果措施是好的,應該清楚文件屬於哪個類別。至於分類器,您的文檔應首先定義一些「特徵」。

如果您有大量的文檔資料庫,您可以嘗試clustering以加快此過程。

最後,爲了確定最終得分,我建議處理幾個最相似的文檔的分數。在這種情況下,原始平均值可能不是最好的主意,因爲「不太相似」也意味着「不太準確」。

至於實施,看看:Simple implementation of N-Gram, tf-idf and Cosine similarity in Python

(恕我直言,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) 

這是一個簡單的線性迴歸。實際上,我預計利息期限不會成爲文本內容的線性函數,但這可能會讓您開始。下一步將是拿起關於機器學習或處理更高級迴歸模型的統計數據的任何教科書。

(*)我是這個項目的貢獻者,所以這不是沒有偏見的建議。幾乎任何一半的機器學習工具包都有線性迴歸模型。

+0

謝謝你給(1)一個名字:k-nearest neighbors regression。這對我有很大的幫助。 – asmaier 2013-02-26 16:17:53