一個簡單的新聞分類器

讀過吳軍《數學之美》的童鞋都知道,很多門戶網站和搜索引擎裡邊的新聞分類都不是人工做的,而是用演算法計算兩兩新聞之間的相似度,把相似度高的新聞放在一個類別里。說到這個演算法其實大家高中都學過,叫餘弦定理,就是COS

餘弦定理:對於任意三角形,任何一邊的平方等於其他兩邊平方的和減去這兩邊與它們夾角的餘弦的兩倍積,假設三邊為a,b,c, 三角為A,B,C

餘弦值越大,則兩條邊的夾角越小。

而這個餘弦值怎麼跟文本相似度扯上關係的呢?在回答這個問題之前,我們必須先弄清楚另外一件事,就是什麼樣的兩個文本可謂之相似?一篇財經新聞肯定跟另外一篇財經新聞相似,而一篇體育新聞按理說不應該跟一篇財經新聞相似,這個相似從人的角度來說就是兩篇文章出現了很多相同的內容,而內容是由詞語組成的,於是兩篇文章應該出現了很多相同的詞。舉以下的栗子

從上圖可以很直觀地看出,新聞1跟新聞2相似,而跟新聞3不相似,原因是新聞1跟新聞2出現的詞語次數(詞頻)的比例相似。

那怎麼去量化這個詞頻相似度呢?如果你上過大學的《線性代數》課就會知道,如果把兩篇新聞的詞頻變成一個多維向量,那麼兩個多維向量的夾角越小,兩篇新聞的詞頻越相似,反之兩篇新聞的詞頻越不相似。

當涉及到兩個向量的夾角時,餘弦定理就派上用場啦,經數學家證明,在多維空間,餘弦定理可以化為

還舉上面的栗子,新聞1的空間向量(x1,x2,x3,x4,x5,x6,x7)=(15,10,5,6,0,0,0),新聞2的空間向量(y1,y2,y3,y4,y5,y6,y7)=(30,20,10,12,0,0,0),兩者的餘弦相似度為

新聞1新聞3的餘弦相似度為

新聞1與新聞2的餘弦相似度遠遠大於新聞1與新聞3的餘弦相似度,因此可以說新聞1與新聞2比新聞1與新聞3更相似

為了驗證這個演算法,我爬下了新浪網的40篇新聞,其中10篇財經新聞,10篇科技新聞,10篇娛樂新聞,10篇體育新聞,分別存在40個txt文件里。

對這40個txt分別進行分詞統計詞頻(我用的是Python的jieba模塊),並存在40個csv文件里,然後計算他們兩兩之間的餘弦相似度,怎麼計算?舉個栗子,計算finance1跟finance2的餘弦相似度,先合併兩個文件的詞語並去重,然後匹配出每個詞語對應的finance1的詞頻和finance2的詞頻,類似上面的新聞例子一樣。接下來計算finance1跟finance3的餘弦相似度,依此遍歷下去,直到算出finance1與其他39個文件的餘弦相似度,得到以下的圖(按餘弦相似度降序排列

看來效果不錯,前面8篇都是財經新聞。

下面換成娛樂新聞試試,計算film1與其他39個文件兩兩的餘弦相似度,最後按照餘弦相似度降序排列

一樣的效果顯著,至此,一個簡單但效果顯著的新聞分類器就完成了。

來都來了,點個贊再走唄 \( ^▽^ )/

奉上Python代碼

import numpy as npimport pandas as pddef main(): text=pd.read_csv("D:/jieba/cos/csv/finance1.csv",names=["word","count"]) name=["sport","finance","film","tech"] cos_finance1={"text":[],"cos":[]} for name_temp in name: for page in range(1,11): fenzi=0 fenmu1=0 fenmu2=0 text2=pd.read_csv("D:/jieba/cos/csv/"+str(name_temp)+str(page)+".csv",names=["word","count2"]) text3=pd.merge(text,text2,how="outer",on="word") text3=text3.fillna(0).drop(0) cos_finance1["text"].append(str(name_temp)+str(page)) for x in text3.index: fenzi+=int(text3.ix[x,"count"])*int(text3.ix[x,"count2"]) fenmu1+=float(text3.ix[x,"count"])**2 fenmu2+=float(text3.ix[x,"count2"])**2 cos_finance1["cos"].append(fenzi/((fenmu1**0.5)*(fenmu2**0.5))) cos_finance1=pd.DataFrame(cos_finance1) cos_finance1.to_csv("D:/jieba/cos/result/finance1.csv",mode="w",index=False,encoding="UTF-8") if __name__=="__main__": main()

下接

一個簡單的新聞分類器【2】 - 挖數的文章 - 知乎專欄

剛開通了微信公眾號(washu66),定期發布原創文章,歡迎關注 p( ^ O ^ )q


推薦閱讀:

阿里天池大數據競賽心得 : 前50強付出與回報
用數據對女生胸圍來次一本正經的探索吧!
go語言如何入門,如何提高?
大數據驅動的人工智慧時代,如何成為2%不被淘汰的人?

TAG:数据分析 | 数据挖掘 | 大数据 |