【实现一套爬虫数据抓取平台】[3-5-01] 相似文章分析

news/2024/7/1 18:07:28

文章目录

  • 零、系列目录
  • 一、背景
  • 二、技术点
  • 三、实现步骤
    • 1、将文本分词
    • 2、将分词结果向量化
    • 3、计算两个向量的余弦相似度
  • 四、核心代码
  • 五、总结

零、系列目录

写这套文章的时候,不会完全按照目录的顺序一篇一篇写, 大家可以到目录中直接找到对应的章节进行查看。

点我跳转

一、背景

爬虫抓回来的文章很多,但有很多是重复或者类似的文章,可能就是某些自媒体的一篇稿件发在了多个平台,或者就是某个品牌方的新闻通稿。

针对这样的文章,我们增加了一个归集相同文章的功能。

具体的功能点实现可以以后再说,这里主要说说如何判断两篇文章(标题)是否相似。

二、技术点

判断两个句子(两段文本)相似度的方法有很多,这里使用其中比较简单的一种:余弦相似度

这里涉及到一些 NLP(自然语言处理) 相关的内容,但我们不需要了解理论细节,直接拿来用就行。

以下内容摘自 维基百科:

余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为0到1之间。

三、实现步骤

1、将文本分词

将文本分词有现成的工具,推荐几个大家自行选择:

  • 结巴分词

号称「做最好的 Python 中文分词组件」,实际使用下来效果也不错,推荐。

  • THULAC

由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。

  • LTP 4

提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等等工作。

2、将分词结果向量化

向量化,即计算了各个词的词频,做成一个矩阵(数组)。

3、计算两个向量的余弦相似度

直接使用 numpy 提供的函数来计算就可以。

dist = float(np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)))

四、核心代码

代码地址:点击跳转

# -*- coding: utf-8 -*-
import jieba
import numpy as np


# 返回分词后的数组
def get_cut_words(t):
    cuts = jieba.cut(t)

    return list(cuts)


# 将两段文本向量化
def get_vectors(t1, t2):
    # 分词
    words1 = get_cut_words(t1)
    words2 = get_cut_words(t2)

    # 取去重后的所有词
    words_all = list(set(words1 + words2))
    len_all = len(words_all)

    # 初始化向量(0矩阵)
    v1 = np.zeros(len_all)
    v2 = np.zeros(len_all)

    # 计算词频(确定向量的每个位置的值)
    for i in range(len_all):
        word = words_all[i]

        v1[i] = words1.count(word)
        v2[i] = words2.count(word)

    print("分词结果,句1:{}".format(words1))
    print("分词结果,句2:{}".format(words2))
    print("汇总去重结果:{}".format(words_all))
    print("向量1:{}".format(v1))
    print("向量2:{}".format(v2))

    return v1, v2


# 计算两个向量的余弦相似度
def get_dist(v1, v2):
    d = float(np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)))
    return d


if __name__ == '__main__':
    title1 = "腾讯今天发布去年Q4财报"
    title2 = "腾讯今天发布今年Q4财报"
    vec1, vec2 = get_vectors(title1, title2)
    dist = get_dist(vec1, vec2)

    print("相似度:{}".format(dist))

运行结果:

Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/z9/dp914shj3xv_bjxwbz5v9p6w0000gn/T/jieba.cache
分词结果,句1:['腾讯', '今天', '发布', '去年', 'Q4', '财报']
分词结果,句2:['腾讯', '今天', '发布', '今年', 'Q4', '财报']
汇总去重结果:['Q4', '今天', '今年', '腾讯', '财报', '发布', '去年']
向量1:[1. 1. 0. 1. 1. 1. 1.]
向量2:[1. 1. 1. 1. 1. 1. 0.]
相似度:0.8333333333333335
Loading model cost 0.747 seconds.
Prefix dict has been built successfully.

五、总结

今天分享的相似文章分析,功能点比较明确,方法也比较简单,大多都是使用现成的工具,直接计算结果就可以。

其他关于 NLP 更深入的内容,咱们以后有机会再聊。

祝大家变的更强。


http://www.niftyadmin.cn/n/4411696.html

相关文章

undo tablespace介绍

undo tablespace介绍 <script src"http://blog.csdn.net/count.aspx?ID1576926&TypeRank" type"text/javascript"> </script> select segment_name, blocks, bytes/1024, status,BLOCK_ID,BLOCK_IDblocks-1 from dba_undo_extents wher…

【实现一套爬虫数据抓取平台】[3-3-01] 部署 Docker+Nginx+uWSGI+Flask 应用

文章目录零、系列目录一、基本概念1、Docker2、Nginx3、uWSGI4、Flask二、部署结构三、结构分析四、实现步骤1、编写 Flask 应用2、编写 uWSGI 配置文件3、编写 Nginx 配置文件4、编写 Docker 启动脚本5、编写 Docker 镜像构建文件6、编写 docker-compose 文件五、测试1、运行2…

逐渐的废掉——所谓的真理

1。好好规划自己的路&#xff0c;不要跟着感觉走&#xff01;根据个人的理想决策安排&#xff0c;绝大部分人并不指望成为什么院士或教授&#xff0c;而是希望活得滋润一些&#xff0c;爽一些。那么&#xff0c;就需要慎重安排自己的轨迹。从哪个行业入手&#xff0c;逐渐对该行…

【刷题】华为笔试面试机考 [HJ30] - 字符串合并处理

题目地址 点击跳转 题目描述 按照指定规则对输入的字符串进行处理。 详细描述&#xff1a; 将输入的两个字符串合并。 对合并后的字符串进行排序&#xff0c;要求为&#xff1a;下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位…

CMPP-SGIP协议设计与实现

移动梦网和联通在信都是构建在有中国特色的短信网关部件基础上的&#xff0c;亚信为中国移动设计的CMPP协议规范&#xff0c;中国联通的SGIP规范都是为这个短信网关提供的互联网接口标准&#xff0c;可以看出二者都是借鉴GSM SMPP协议的两种简化版。 CMPP提供了基于TCP的长连接…

【刷题】数据库SQL实战 [SQL01] - 查找最晚入职员工的所有信息

题目地址 点击跳转 题目描述 有一个员工employees表简况如下: 建表语句如下: CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, first_name varchar(14) NOT NULL, last_name varchar(16) NOT NULL, gender char(1) NOT NULL, hire_date dat…

【刷题】数据库SQL实战 [SQL02] - 查找入职员工时间排名倒数第三的员工所有信息

题目地址 点击跳转 题目描述 有一个员工employees表简况如下: 建表语句如下: CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, first_name varchar(14) NOT NULL, last_name varchar(16) NOT NULL, gender char(1) NOT NULL, hire_date dat…

【实现一套爬虫数据抓取平台】[3-5-02] CentOS 关闭超时进程

文章目录零、系列目录一、背景二、脚本代码三、解析执行步骤代码获取进程 pid获取进程的运行时间四、总结零、系列目录 写这套文章的时候&#xff0c;不会完全按照目录的顺序一篇一篇写&#xff0c; 大家可以到目录中直接找到对应的章节进行查看。 点我跳转 一、背景 在运行…