相似文章推荐

作者: 羽恒 | 来源:发表于2017-12-03 11:36 被阅读13次

    知识点普及

    • 推荐: 指介绍好的人或事物,希望被任用或接受,数据挖掘领域推荐包括:相似推荐以及协同过滤推荐
    • 相似推荐:指用户对某人或某物感兴趣时,为其推荐与相似的人或物。核心定理:物以类聚、人以群分
    • 协同过滤推荐:指利用已有客户群体过去的意见或行为,预测当前用户最可能喜欢的物品或人物,或者对什么东西比较感兴趣
    • 余弦相似度:用向量空间中两个向量夹角的余弦值来衡量两个个体间差异的大小,余弦值越接近1,就表明夹角越接近0度,意味着两个向量越相似
    余弦相似度公式
    • 余弦距离计算: sklearn.metrics.pairwise_distances
      • metrix: 矩阵
      • metric = 'cosine' 距离计算公式

    样例代码

    #!/usr/bin/env python
    # coding=utf-8
    
    
    
    import os 
    import codecs
    import numpy as np 
    
    
    # 生成分词字符串
    filePaths = []
    fileContents = []
    for root,dirs,files in os.walk('../data/input/SogouC.mini/Sample/'):
        for name in files:
            filePath = os.path.join(root,name)
            filePaths.append(filePath)
            f = codecs.open(filePath,'r','utf-8')
            fileContent = f.read()
            f.close()
            fileContents.append(fileContent)
    
    import pandas as pd 
    
    # 对分词文档做DataFrame运算 
    corpos = pd.DataFrame({
        'filePath':filePaths,
        'fileContent':fileContents
    })
    
    
    import re 
    # 匹配中文分词正则表达式
    zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
    
    
    
    import jieba 
    segments = []
    filePaths = []
    
    for index, row in corpos.iterrows():
        filePath = row['filePath']
        fileContent = row['fileContent']
        segs = jieba.cut(fileContent)
        for seg in segs:
            if zhPattern.search(seg):
                segments.append(seg)
        filePaths.append(seg)
        # 分词完成后添加空格
        row['fileContent'] = ' '.join(segments)
    
    from sklearn.feature_extraction.text import CountVectorizer
    
    stopwords = pd.read_csv('../data/input/StopwordsCN.txt',
                           encoding = 'utf-8',
                           index_col = False,
                           quoting = 3,
                           sep = '\t')
    # 提取文章关键字
    countVectorizer = CountVectorizer(
        stop_words = list(stopwords['stopword'].values),
        min_df = 0, token_pattern = r"\b\w+\b"
        )
    # 对文档关键字做向量化处理,生成文档向量化矩阵
    textVector = countVectorizer.fit_transform(
        corpos['fileContent']
        )
    from sklearn.metrics import pairwise_distances
    
    #计算两两之间的余弦相似度
    distance_matrix = pairwise_distances(
        textVector,
        metric = 'cosine'
        )
    
    m = 1 - pd.DataFrame(distance_matrix)
    m.columns = filePaths
    m.index   = filePaths
    
    #每篇文章最相似的五篇文章
    sort = np.argsort(distance_matrix,axis = 1)[:,1:6]
    
    
    similarity5 = pd.Index(filePaths)[sort].values
    
    similarityDF = pd.DataFrame({
        'filePath':corpos.filePath,
        's1':similarity5[:,0],
        's2':similarity5[:,1],
        's3':similarity5[:,2],
        's4':similarity5[:,3],
        's5':similarity5[:,4],
    })
    

    相关文章

      网友评论

        本文标题:相似文章推荐

        本文链接:https://www.haomeiwen.com/subject/frdabxtx.html