(4) 相似文章推薦

開發(fā)環(huán)境

系統(tǒng): macOS Sierra骚揍; 開發(fā)軟件: PyChram CE信不; 運行環(huán)境: Python3.6

需求分析

在用戶閱讀某篇文章的時候,為用戶推薦更多與在讀文章內(nèi)容相似的文章

概念

<b>相似推薦</b>:當用戶表現(xiàn)出對某人或某物感興趣時硫戈,為他/她推薦相似的人或物丁逝,核心思想:人以類聚梭姓,物以群分誉尖;
<b>協(xié)同過濾推薦</b>:指利用用戶過去的行為或意見萝衩,預測當前用戶最喜歡哪些東西或對哪些東西感興趣

采用余弦相似度原理來實現(xiàn)相似文章推薦

<b>原理:</b>
將每篇文章的詞頻統(tǒng)計結果當作一個向量猩谊,如果兩篇文章向量的夾角越小即余弦值越接近1牌捷,那么我們說這兩篇文章越相似


原理.png

假如有如下兩篇文章
文章A - '放假我喜歡彈吉他暗甥,看書'
文章B - '放假我不喜歡看書撤防,喜歡打球'
這兩篇文章的詞頻統(tǒng)計結果如下:

      放假 我 喜歡 彈 吉他 看書 不 打球
文章A   1  1  1   1  1   1   0   0
文章B   1  1  2   0  0   1   1   1

則根據(jù)余弦計算公式寄月,文章A和文章B兩個向量間的余弦值計算如下:


math.png

若余弦值越接近1漾肮, 則說明文章A和B越相似


  • 導入需要用到的包

import os
import codecs
import re
import jieba
import pandas
import numpy
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import pairwise_distances
  • 創(chuàng)建語料庫

# 創(chuàng)建語料庫
filePaths = []
fileContents = []
for root, dirs, files in os.walk(
    'data/SogouC.mini/Sample'
):
    for name in files:
        filePath = os.path.join(root, name)
        f = codecs.open(filePath, 'r', 'utf-8')
        fileContent = f.read()
        f.close()
        filePaths.append(filePath)
        fileContents.append(fileContent)

corpus = pandas.DataFrame({
    'filePath': filePaths,
    'fileContent': fileContents
})

語料庫中的文章是從搜狗實驗室下載的,內(nèi)容如下:

目錄結構.png

創(chuàng)建的語料庫如下:

語料庫.png
  • 對文章進行分詞

# 匹配中文分詞
zhPattern = re.compile(u'[\u4e00-\u9fa5]+')

# 對每篇文章進行分詞處理
for index, row in corpus.iterrows():
    fileContent = row['fileContent']
    segments = []
    segs = jieba.cut(fileContent)  # 分詞默認以','分隔
    for seg in segs:
        if zhPattern.search(seg):
            segments.append(seg)
    row['fileContent'] = ' '.join(segments)  # 將分詞以空格分隔

分詞后結果如下:


分詞.png
  • 統(tǒng)計詞頻,將詞頻向量化

# 讀取停用詞文件
stopWords = pandas.read_csv(
    'data/StopwordsCN.txt',
    encoding='utf-8',
    index_col=False,
    quoting=3,
    sep='\t'
)

# 詞頻統(tǒng)計 & 文檔向量化
countVectorizer = CountVectorizer(
    stop_words=list(stopWords['stopword'].values),
    min_df=0,
    token_pattern=r"\b\w+\b"
)
textVector = countVectorizer.fit_transform(corpus['fileContent'])

詞頻矩陣如下:


vector.png
  • 統(tǒng)計詞頻矩陣的余弦相似度計算

# 統(tǒng)計詞頻矩陣的余弦相似度計算
distance_matrix = pairwise_distances(
    textVector,
    metric='cosine'
)

運行結果如下:


cosine.png

上面的矩陣代表的意思是兩個文章(即兩個向量)之間的夾角值,這里我用x代替上面矩陣中的數(shù)值扔亥。 為什么斜對角的數(shù)值都為0呢旅挤?因為文章跟本身是完全相同的伞鲫,所以兩個向量相同,夾角值為0

     文章1  文章2  文章3  ...  文章n
文章1  0     x     x     ...   x 
文章2  x     0     x     ...   x
文章3  x     x     0     ...   x
...   ...   ...   ...   ...   ...
文章n  x     x     x     ...   0
  • 獲取與該文章最相似的3篇文章(即矩陣中值最小的前三個)

# 獲取與本篇文章相似度最高的三篇文章
sort_matrix = numpy.argsort(distance_matrix, axis=1)[:, 1:4]  # argsort為升序排列,取第1列到第3列的值儒搭,第0列為自己本身
similarity = pandas.Index(filePaths)[sort_matrix].values

similarityDF = pandas.DataFrame({
    'filePath': filePaths,
    's1': similarity[:, 0],
    's2': similarity[:, 1],
    's3': similarity[:, 2],
})

最后結果如下:


result.png
  • 參考

小蚊子數(shù)據(jù)分析

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市魂仍,隨后出現(xiàn)的幾起案子拣挪,更是在濱河造成了極大的恐慌菠劝,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锯岖,死亡現(xiàn)場離奇詭異出吹,居然都是意外死亡辙喂,警方通過查閱死者的電腦和手機巍耗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門炬太,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炒考,你說我怎么就攤上這事斋枢≈” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵轩勘,是天一觀的道長怯邪。 經(jīng)常有香客問我擎颖,道長观游,這世上最難降的妖魔是什么懂缕? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任搪柑,我火速辦了婚禮,結果婚禮上弱睦,老公的妹妹穿的比我還像新娘渊额。我一直安慰自己旬迹,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惶岭,像睡著了一般犯眠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兆衅,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天羡亩,我揣著相機與錄音畏铆,去河邊找鬼。 笑死楷怒,一個胖子當著我的面吹牛瓦灶,可吹牛的內(nèi)容都是我干的贼陶。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撮胧!你這毒婦竟也來了?” 一聲冷哼從身側響起馒闷,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤纳账,失蹤者是張志新(化名)和其女友劉穎捺疼,沒想到半個月后啤呼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡翅敌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年蚯涮,在試婚紗的時候發(fā)現(xiàn)自己被綠了遭顶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖铣揉,靈堂內(nèi)的尸體忽然破棺而出逛拱,到底是詐尸還是另有隱情,我是刑警寧澤额湘,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站箭窜,受9級特大地震影響衍腥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜竹捉,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一块差、第九天 我趴在偏房一處隱蔽的房頂上張望憨闰。 院中可真熱鬧需五,春花似錦、人聲如沸泽示。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽族扰。三九已至渔呵,卻和暖如春砍鸠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背录豺。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工双饥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咏花,地道東北人阀趴。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓刘急,卻偏偏與公主長得像,于是被迫代替她去往敵國和親统求。 傳聞我的和親對象是個殘疾皇子攻柠,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容