2014-10-18 32 views
2

我正在嘗試構建一個算法,能夠根據我喜歡的以前的文章來預測我是否會喜歡一篇文章。用scikit-learn預測有趣的文章

例子:

  • 我讀50篇文章,我很喜歡10.我告訴我的節目,我很喜歡他們。
  • 然後20篇新文章即將到來。根據我以前喜歡的10個,我的程序必須爲每篇新文章給出「相似百分比」。

我發現這裏鉛: Python: tf-idf-cosine: to find document similarity

>>> from sklearn.feature_extraction.text import TfidfVectorizer 
>>> from sklearn.datasets import fetch_20newsgroups 
>>> twenty = fetch_20newsgroups() 
>>> tfidf = TfidfVectorizer().fit_transform(twenty.data) 

,然後到數據集的第一個文件比較數據集中的其他文件:

>>> from sklearn.metrics.pairwise import linear_kernel 
>>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten() 
>>> cosine_similarities 
array([ 1.  , 0.04405952, 0.11016969, ..., 0.04433602, 
    0.04457106, 0.03293218]) 

我的情況,我想我會做的是連接我的10篇文章的文本,運行TfidfVectorizer,然後將新的大矢量與每篇新文章進行比較。

但我不知道如何比較會做:

  • 相比少一個或
  • 的小一大載體(10篇),比自己大一個

我不知道你是否明白我的觀點,但在第一種情況下,大矢量中90%的單詞不在小單詞中。

所以我的問題是:如何計算餘弦相似度?你看到我的項目更好的方法嗎?

回答

4

A naive bayes分類器應該表現更好。您的問題類似於傳統的垃圾郵件分類問題。在你的情況下,你不認同垃圾郵件(你不喜歡),但確定火腿(你喜歡什麼文章)。

從最初的50頁標記的文章,可以很容易地計算出以下數據:

p(word1|like) -- among all the articles I like, the probability of word1 appears 
p(word2|like) -- among all the articles I like, the probability of word2 appears 
... 
p(wordn|like) -- among all the articles I like, the probability of wordn appears 

p(word1|unlike) -- among all the articles I do not like, the prob of word1 appears 
... 

p(like) -- the portion of articles I like (should be 0.2 in your example) 
p(unlike) -- the portion of articles I do not like. (0.8) 

然後給予第51屆新的例子,你會發現在它的所有見過的詞,例如,它僅包含單詞2和的word5。 天真的貝葉斯的好處之一是它只關心詞彙中的單詞。甚至超過90%的大矢量字不會出現在新字中,因爲所有不相關的功能都可以相互抵消而不會影響結果。

likelihood ratio將是

prob(like|51th article)  p(like) x p(word2|like) x p(word5|like) 
---------------------------- = ----------------------------------------- 
    prob(unlike|51th article) p(unlike)xp(word2|unlike)xp(word5|unlike) 

只要比> 1,則可以預測製品 「喜歡」。此外,如果您想提高識別「喜歡」的文章的精確度,您可以通過將閾值比率值從1.0增加到更大的值來玩精確度 - 回憶平衡。另一方面,如果您想增加召回率,則可以降低閾值等。

要進一步閱讀文本域中樸素貝葉斯分類,請參閱here

該算法可以很容易地修改爲在線學習,即一旦新示例被用戶「喜歡」或「不喜歡」,就更新學習模型。由於上述統計表中的每一件事都基本上是標準化計數。只要保留每個計數(每個字)和保存的總計數,就可以按實例更新模型。

使用tf-idf權重一個單詞爲樸素貝葉斯,我們把重量作爲單詞的計數。即,沒有tf-idf,每個文檔中的每個單詞都計爲1;用tf-idf,文件中的單詞被計爲TF-IDF的權重。然後你使用相同的公式得到樸素貝葉斯的概率。這個想法可以在paper找到。我認爲multinomial naive bayes classifier in scikit-learn應該接受tf-idf權重作爲輸入數據。

參見注釋爲MultinomialNB:

多項式樸素貝葉斯分類器是適合於與離散特徵分類 (例如,用於文本分類字計數)。 多項分佈通常需要整數特徵計數。 但是,在實際中,,分數如tf-idf也可能起作用。

+0

謝謝你,這是一個答案。現在我只需要與python建立聯繫。當你談論一個詞的概率時,它是「真正的」概率,還是我可以使用tf-idf?如果是tf-idf,很容易得到p(wordn | like)的概率。 – Rififi 2014-10-19 09:07:57

+1

沒有tf-idf,每個文檔中的每個單詞都計爲1;用tf-idf,文件中的單詞被計爲TF-IDF的權重。然後你使用相同的公式得到樸素貝葉斯的概率。 – greeness 2014-10-19 09:32:36