查看原文
其他

Python:计算管理层讨论与分析的余弦相似度

连享会 连享会 2023-10-24

👇 连享会 · 推文导航 | www.lianxh.cn

连享会 · 2022暑期班

作者:梁淑珍 (华侨大学)
邮箱:13514084150@163.com

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

编者按:本文主要参考自下文「Cosine Similarity Explained using Python」,特此致谢!


目录

  • 1. 余弦相似度原理

  • 2. 计算余弦相似度

  • 3. 计算MDA相似度

  • 4. 相关推文




我们所熟知的智能推荐算法,在很大程度上依赖于能否正确识别一组研究对象或用户之间的相似性。计算相似度的方法有很多,本文主要介绍余弦相似度。

1. 余弦相似度原理

余弦相似度是通过计算两个非零向量的余弦值来衡量它们之间的相似程度,这与内积的计算过程相同。具体来看以下三个向量:

接着,将这三个向量绘制在坐标轴中:

从上图可以看出 更接近 ,可以说 更相似。那么,我们该如何从数学上度量它们之间的相似性呢?一个直接的方法是通过余弦值来判断两个向量的接近程度,相关计算公式如下:

具体来看,余弦相似度计算过程可分为以下三步:

Step1:计算点积

其中, 分别代表向量 的第 个分量。在本例中,向量 和向量 的点积为:

Step2:计算模长

在本例中,

Step3:计算余弦相似度

经过计算,向量 与向量 之间的余弦相似度约为 0.976。要注意,相似度的计算具有对称性,即 的相似度等价于 的相似度。重复上述计算过程,可以得出 的余弦相似度值约为 0.740。以上结果和我们看到的结果基本一致。但在大多数情况下,待处理的数据有多个甚至上百个特征,在高维空间中,想要通过可视化判断数据之间的相似程度是不可能的。

2. 计算余弦相似度

在理解了余弦相似度的原理之后,赶紧实操起来吧!例如,现有三种产品,连帽衫、毛衣和短上衣,我们想知道哪两种产品比较相似。其中,这三种产品的长宽数据如下:

ProductWidthLength
Hoodie14
Sweater24
Crop−top32

以上数据集与文章开头使用的数据集完全一致。我们可以通过常识判断,连帽衫和毛衣的相似度更高。利用 Python 计算余弦相似度时,我们需要导入 pandassklearn 两个模块。首先,将数据导入到数据框中。

import pandas as pd
data = {'width': [123],
        'length': [442]}
df = pd.DataFrame (data, columns = ['width','length'])
print(df)

接下来,使用 sklearn 库中的 cosine_similarity() 方法,算出数据集中每个向量之间的余弦相似度。

from sklearn.metrics.pairwise import cosine_similarity
similarity = cosine_similarity(df)
print(similarity)

输出结果为二维数组:

[[1.         0.97618706 0.73994007]
 [0.97618706 1.         0.86824314]
 [0.73994007 0.86824314 1.        ]]

为了更好地理解这些数字,可以将数组转化为矩阵。


ABC
A10.980.74
B0.9810.87
C0.740.871

Python 的计算结果与手工计算相同,使用以上代码可以将数据集扩展至更高维度。

3. 计算MDA相似度

以上为英文情境下余弦相似度的计算,接着,我们来看一下中文情境下余弦相似度如何计算。在这里,我们使用到了 CNRDS 数据库中关于 MDA 的 10 个样本数据,如需完整的 MDA 数据请到 CNRDS 数据库中下载。

# 导入包
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import jieba
import re

# 调用数据
data = pd.read_excel("https://file.lianxh.cn/data/m/mda.xlsx")
stopwords = pd.read_csv("https://file.lianxh.cn/data/c/cn_stopwords.txt", names=["stopwords"])

# 定义分词函数
def cut_words(text):
    words_list = []
    text = re.sub("[\W\d]""", text) # 替换符号和数字
    words = jieba.lcut(text)
    for word in words:
        if word not in list(stopwords["stopwords"]):
            words_list.append(word)
    return " ".join(words_list)

# 对文本分词
data["BusDA"] = data["BusDA"].apply(cut_words)
data

# 计算余弦相似度矩阵
vectorizer = CountVectorizer(token_pattern=r"(?u)\b\w+\b")
vec = vectorizer.fit_transform(data["BusDA"])
cosine_similarity(vec)

分词后的结果:

余弦相似度矩阵:

array([[1.        , 0.3165504 , 0.318955060.276778750.33998794,
        0.253488230.274881110.299968530.253456150.32091215],
       [0.3165504 , 1.        , 0.658846210.524968360.71573014,
        0.652179310.614716670.577450840.649275210.67862564],
       [0.318955060.658846211.        , 0.6071593 , 0.72656538,
        0.740815120.805013180.562696240.690081680.72926925],
       [0.276778750.524968360.6071593 , 1.        , 0.50823713,
        0.564321370.594906040.467880290.525151390.572396  ],
       [0.339987940.715730140.726565380.508237131.        ,
        0.676401370.667676560.495950910.639131390.74228471],
       [0.253488230.652179310.740815120.564321370.67640137,
        1.        , 0.779041890.541622750.703343950.68416732],
       [0.274881110.614716670.805013180.594906040.66767656,
        0.779041891.        , 0.525150540.686319570.63833877],
       [0.299968530.577450840.562696240.467880290.49595091,
        0.541622750.525150541.        , 0.555045220.57993023],
       [0.253456150.649275210.690081680.525151390.63913139,
        0.703343950.686319570.555045221.        , 0.67550277],
       [0.320912150.678625640.729269250.572396  , 0.74228471,
        0.684167320.638338770.579930230.675502771.        ]])

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh python, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 专题:文本分析-爬虫
    • Stata+Python:爬取创历史新高股票列表
    • Python:爬取东方财富股吧评论进行情感分析
    • VaR 风险价值: Stata 及 Python 实现
    • 支持向量机:Stata 和 Python 实现
    • Python爬虫: 《经济研究》研究热点和主题分析
  • 专题:Python-R-Matlab
    • Python:多进程、多线程及其爬虫应用
    • Python:爬取动态网站
    • Python爬取静态网站:以历史天气为例
    • Python:绘制动态地图-pyecharts
    • Python爬虫1:小白系列之requests和json
    • Python爬虫2:小白系列之requests和lxml
    • Python爬虫:爬取华尔街日报的全部历史文章并翻译
    • Python爬虫:从SEC-EDGAR爬取股东治理数据-Shareholder-Activism
    • Python:爬取巨潮网公告
    • 司继春:Python学习建议和资源
    • Stata交互:Python-与-Stata-对比
    • Python:拆分文件让百万级数据运行速度提高135倍
    • Python+Stata:批量制作个性化结业证书
    • Python+Wind:用 Pyautogui 轻松下载 Wind 数据
    • Python:爬取上市公司公告-Wind-CSMAR
    • Python: 如何优雅地管理微信数据库?
    • Python: 6 小时爬完上交所和深交所的年报问询函
    • Python: 使用正则表达式从文本中定位并提取想要的内容
    • Python 调用 API 爬取百度 POI 数据小贴士——坐标转换、数据清洗与 ArcGIS 可视化
    • Python 调用 API 爬取百度 POI 数据
    • Python 调用 API 进行逆地理编码
    • Python 调用 API 进行地理编码
    • Python: 批量爬取下载中国知网(CNKI) PDF论文

课程推荐:因果推断实用计量方法
主讲老师:丘嘉平教授
🍓 课程主页https://gitee.com/lianxh/YGqjp

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存