基于 Jieba 和 Word2vec 的关键词词库构建

news2024/11/15 10:40:06

最近有空,把论文中用到的技术和大家分享一下(以组件化的形式),本篇将讲述如何从大量的语料中获取诸多关键词和构建关键词词库或 xx 关键词词库(细分领域)。举例以购物网站的在线评论作为语料库,对其进行分词等操作,最终构建关键词词库(以物流关键词词库为例)和顺便绘制词云图。关键词词库构建完成后,可以做的事情就多了,往后包括权值计算和情感分析,这些都是将关键词作为基础单位的,往前对接 xx 评价指标体系(这些是题外话,可以忽略)。

目录

1 Jieba 分词及词频统计

1.1 自定义词典

1.2 停用词典

1.3 词频统计—初步构建词库

① 语料

② 处理 excel 语料数据

③ 分词及词频统计

④ 初步构建物流关键词词库

2 word2vec 拓展关键词词库

2.1 训练 word2vec 模型

2.2 使用模型—最终构建词库

2.3 Wordcloud 词云图


代码地址:https://gitee.com/yinyuu/nlp_yinyu

1 Jieba 分词及词频统计

jieba 是一种中文分词工具,它可以将中文文本进行分词,将文本中的词语分开,并标注它们的词性。可以通过以下命令进行安装:

pip install jieba

1.1 自定义词典

jieba 进行分词时,绝大部分的词汇都能识别出来,但是对于一些特有名词的识别就比较困难了,比如京东、淘宝、拼多多等等,这些特有词汇与在线评论的语料紧密关联,但是作为特有名词一般不会被记录在 jieba 模型中。

因此需求构建自定义词典,来处理语料中可能出现的特有名词,进而避免过度切分(比如将拼多多切分为多多)。

同时,自定义词典也承担着指导关键词词库的作用,针对购物网站的在线评论,比如构建物流关键词词库,那么就需要补充物流相关特有名词加入自定义词典;比如构建包装关键词词库,那么就需要包装相关特有名词......

📌 词库网站

这里推荐搜狗输入法的词库网站,涵盖了蛮多领域,词库的选择取决于你研究的对象和语料基础。

https://pinyin.sogou.com/dict/cate/index/96

📌 处理 scel 格式文件

下载完某词库后,它是 scel 格式文件,这不符合 jieba 自定义词典的加载格式,因此需要进行处理。

比如物流词汇大全【官方推荐】.scel,大家可以下载深蓝词库工具将其转化为 text 文本(随后可将后缀改为 txt 即可),或者以下在线处理网站:https://www.toolnb.com/tools/scelto.html,这样就更方便了。

处理完后如下:

1.2 停用词典

分词时,其实并没有将数字、符号、虚词等不相关内容做区分,这些词就是停用词,因为这些词对于后面的研究来说意义不大,而且还可能影响文本分析的效率和准确性,因此需要使用停用词典。

之前我整合了百度停用词表+哈工大停用词表+机器智能实验室停用词库等词表,可在项目中自取~

1.3 词频统计—初步构建词库

① 语料

接下来使用 jieba 进行一次简单的词频统计,语料是我之前爬取的京东网站上的 5000 条评论数据,可在文章顶部下载查看,截图如下:

② 处理 excel 语料数据

大家可以看到,目前语料数据还是 excel 格式,这是不满足 jieba 分词的要求的,因此需要对其做进一步的处理,代码如下:

import xlrd

'''
工具类
'''
class BaseHandle(object):

    def read_col_merge_file(self, filename):
        '''读取合并列表comments列的值输出为txt'''
        excel = xlrd.open_workbook(filename)  # 打开excel文件
        table = excel.sheet_by_index(0)  # 根据下标获取工作薄,这里获取第一个
        comments_list = table.col_values(1, start_rowx=1)  # 获取第一列的内容
        comments_str = '\n'.join(comments_list)  # 将数组转换成字符串,空行连接,模仿text文本
        return comments_str


if __name__ == '__main__':
    base = BaseHandle()
    comments_str = base.read_col_merge_file('语料库_京东_5000条评论.xlsx')
    print(comments_str)

注意 xlrd 库的版本,需要小于等于 1.2.0,不然无法解析 xlsx 格式文件。同时由于我把文件放在了同目录下,因此 filename 直接使用文件名,不然建议使用绝对路径。

该方法使用后效果如下:

③ 分词及词频统计

因为本文以构建物流关键词词库为例,因此引入物流词汇自定义词典,主要分为以下三步:

  1. 引入语料 excel 数据
  2. jieba 分词
  3. 对分词结果进行统计,最后生成【高频词统计.xlsx】文件

注意,需要安装 openpyxl 这个库,那么 DataFrame 才能生成 excel 文件。

代码如下:

import jieba
import pandas as pd
from base_handle import BaseHandle # 引入工具类

baseHandle = BaseHandle() #实例化

def split_words_jieba(text):
    '''jieba分词操作'''
    diy_dict = ('物流词汇大全.txt')  # 引入自定义词典
    jieba.load_userdict(diy_dict)  # 加载自定义字典
    comment_cut = jieba.lcut(text)  # 分词结果
    print(comment_cut)

    # 引入停用词表,当文本文件中带有英文双引号时,直接用pd.read_csv进行读取会导致行数减少,因此使用quoting=3
    stop_dic = ('百度+哈工大+机器智能实验室停用词库.txt')
    stopwords = pd.read_csv(stop_dic, names=['w'], header=None, sep='\t', encoding='utf-8', quoting=3)
    datas = []  # 去除停用词提取名词
    for word in comment_cut:
        if word not in list(stopwords.w) and len(word) > 1:
            datas.append(word)
    # print("分词+停用词成功\n"+str(data))
    return datas


def count_fre_words(datas):
    '''高频词统计'''
    counts = {}  # 新建1个字典
    for data in datas:
        counts[data] = counts.get(data, 0) + 1
    # 将字典列表化,并按频次排序
    items = list(counts.items())
    items.sort(key=lambda x: x[1], reverse=True)
    dt = pd.DataFrame(items, columns=['keyword', 'fre'])  # list 转换为 df
    # print(dt)
    dt1 = dt[(dt.fre != 1)]  # 删去频次为1的关键词
    dt1.to_excel('高频词统计.xlsx')  # 储存为表格


if __name__ == "__main__":
    # 1.引入语料excel数据
    text = baseHandle.read_col_merge_file('语料库_京东_5000条评论.xlsx')
    # 2.jieba分词
    datas = split_words_jieba(text)
    # 3.对分词结果进行统计,最后生成【高频词统计.xlsx】文件
    count_fre_words(datas)

部分分词结果如下,可以看到语料数据被切分成一个个词汇

最终输出【高频词统计.xlsx】文件如下:

④ 初步构建物流关键词词库

此时,物流关键词词库已经初具模型了,基于这个高频词统计结果,我们可以将其中联系到物流的关键词筛选出来,作为物流关键词的初步词库

因为自定义词典已经是【物流词汇大全.txt】了,因此绝大部分物流词汇都将包含在内,这些关键词排名越靠前,那么他在语料中的频次或者说重要性越大。一般来说,取排名靠前的关键词即可,排名越靠后,那么该关键词的影响作用也就越小,对于后边的统计研究意义也不大。

举例来说,我在此取 20 个物流关键词,将其放入工具类中:

class BaseHandle(object):

    def __init__(self):
        # 物流关键词词库:初步20个
        self.logistics_list = ['京东', '新鲜', '包装', '物流', '很快', '快递', '收到','速度', '送货', '推荐',
                               '小哥', '服务', '发货', '配送', '送到', '到货', '第二天', '冷链', '完好', '送货上门']

接下来就是通过 Word2vec 对物流关键词词库进行拓展。

2 word2vec 拓展关键词词库

简单来说,上边的流程已经满足构建基础关键词词库的要求了,不过为了使得研究更加“高级”一些,可以考虑使用 Word2vec 来拓展关键词词库,主要是起到完善关键词词库的作用。

关于 word2vec 的理论知识就暂且不提了,主要是分析词汇间的相关度(相关度越高,两词汇越紧密),以下是如何使用 word2vec 的流程。

Gensim Python 的一个自然语言处理模块,该模块下命名为 word2vec 的模型封装了word2vec 的实现逻辑,可以使用它来进行 word2vec 算法操作:

pip install gensim

2.1 训练 word2vec 模型

word2vec 使用第一步是针对语料训练属于该语料数据的模型,特殊的一点在于,它需要针对每条评论/语料的的分词结果进行训练分析,这是因为 word2vec 本质在于分析词汇间的联系,他需要许多独立的分词结果进行解析。

代码如下:

import xlrd
from gensim.models import word2vec
from word_count import split_words_jieba

def wordcut_listinlist(url):
    '''读取excel评论并分别对每条评论进行分词操作'''
    excel = xlrd.open_workbook(url)  # 打开excel文件
    table = excel.sheet_by_index(0)  # 根据下标获取工作薄,这里获取第一个
    comments_list = table.col_values(1, start_rowx=1)  # 获取第一列的内容
    list = []
    for i in comments_list:
        a = split_words_jieba(i)
        list.append(a)
    return list  # [['xx','xx]、['X']、['XXX']]


def word2vec_trainmodel(url):  # 训练一次就行了
    '''Word2vec关键词扩展——训练模型'''
    sentennce = wordcut_listinlist(url)
    # 1.建立模型
    model = word2vec.Word2Vec(sentennce, vector_size=200)  # 训练skip-gram模型,默认window=5
    # 2.保存模型,以便重用
    model.save(u"word2vec_last.model")

if __name__ == "__main__":
    word2vec_trainmodel('语料库_京东_5000条评论.xlsx') #5000条评论,运行2分钟

随后同目录下会输出命名为 word2vec_last.model 的文件,这表示训练成功:

2.2 使用模型—最终构建词库

然后就是直接使用该模型就行了,入参是某个关键词,输出 10 个与其相近的关键词,可修改 topn 来控制输出相关关键词的个数。

def similar_words(word):
    '''计算某个词的相关词列表——前提是已存在训练好的模型'''
    model1 = word2vec.Word2Vec.load("word2vec_last.model")  # 模型的加载方式
    y2 = model1.wv.most_similar(word, topn=10)  # 10个最相关的
    print("和{}最相关的词有:".format(word))
    for item in y2:
        print(item[0], '%.3f' % item[1])

if __name__ == "__main__":
    similar_words('物流')

比如查询“物流”的在该语料中最相关的关键词:

接下来就可以依据现实情况给关键词词库添加关键词了,这都取决于你。我简单地给之前的物流关键词词库加 10 个关键词:

class BaseHandle(object):

    def __init__(self):
        # 物流关键词词库:目前30个物流关键词
        self.logistics_list = ['京东', '新鲜', '包装', '物流', '很快', '快递', '收到','速度', '送货', '推荐',
                               '小哥', '服务', '发货', '配送', '送到', '到货', '第二天', '冷链', '完好', '送货上门'
                               #使用word2vec加的关键词 👇
                               '运送', '严谨', '保障', '速度快', '效率', '方便快捷', '客服', '省心', '快捷', '严实']

当然这只是做个演示,实际研究时很难不上百。

2.3 Wordcloud 词云图

前边我们已经构建完物流关键词词库了,那么为了继续整活,可以给词库里的关键词做个词云图,这不就显得高大上了。

📌 物流关键词词频

虽然前边构建了词库,但是并不知道具体某个关键词的词频是多少,这时之前的【高频词统计.xlsx】就派上用场了。简单来说,就算依据每个物流关键词,遍历【高频词统计.xlsx】,找到属于每个物流关键词的词频,这是做关键词词库词云图的基础。

依旧将他放在工具类里边,代码如下:

import xlrd
import pandas as pd

'''
工具类
'''
class BaseHandle(object):

    def __init__(self):
        # 物流关键词词库:目前30个物流关键词
        self.logistics_list = ['京东', '新鲜', '包装', '物流', '很快', '快递', '收到', '速度', '送货', '推荐',
                               '小哥', '服务', '发货', '配送', '送到', '到货', '第二天', '冷链', '完好', '送货上门'
                               # 使用word2vec加的关键词 👇
                                                                                                         '运送', '严谨',
                               '保障', '速度快', '效率', '方便快捷', '客服', '省心', '快捷', '严实']

    def words_fre_match(self, filename, lis):
        '''关键词批量匹配词频'''
        df = pd.read_excel(filename)#'高频词统计.xlsx'
        b1 = []
        b2 = []
        for i in range(len(df)):
            keyword = df.loc[i, 'keyword']
            if any(word if word == keyword else False for word in lis):  # 判断列表(list)内一个或多个元素是否与关键词相同
                a1 = df.loc[i, 'keyword']
                a2 = df.loc[i, 'fre']
                b1.append(a1)
                b2.append(a2)
            else:
                continue
        f1 = pd.DataFrame(columns=['关键词', '词频'])
        f1['关键词'] = b1
        f1['词频'] = b2
        f1.to_excel('物流关键词词频匹配表.xlsx')

if __name__ == '__main__':
    base = BaseHandle()
    base.words_fre_match('高频词统计.xlsx', base.logistics_list)
    pass

输出文件内容如下:

📌 词云图

接下来就可以使用这个匹配表来绘制词云图了富裕的同学可以使用在线网站来进行制作,毕竟要比代码制作美观方便多了,比如:https://design.weiciyun.com/。

以下以 wordcloud 库绘制词云图为例,由于 wordcloud 库依赖 numpy 库和 PIL 库的,因此需要提前安装好这两个库。词云图有两种做法:

  1. 针对文本,先 jieba 分词,然后进行绘制
  2. 根据已知的词频进行绘制

那我们正是使用第二种方式,读取【物流关键词词频匹配表.xlsx】文件如下:

把该方法放在工具类中,以下是简单绘制的代码:

import pandas as pd
import matplotlib.pyplot as plt
from wordcloud import WordCloud

class BaseHandle(object):

    def wordcloud_by_wordcount(self, filename):
        '''根据词汇及对应词频绘制词云图'''
        data = pd.read_excel(filename, sheet_name='Sheet1') # 获得数据
        data_gr = data.groupby(by='关键词', as_index=False).agg({'词频': int}) # 拿数据
        dic = dict(zip(data_gr['关键词'], data_gr['词频'])) # 转化为字典形式
        # print(dic)

        # fit_word函数,接受字典类型,其他类型会报错
        wordcloud = WordCloud(font_path='simhei.ttf', background_color="white", width=4000, height=2000,
                              margin=10).fit_words(dic)
        plt.imshow(wordcloud)
        plt.axis("off") # 取消坐标轴
        plt.show() # 显示

if __name__ == '__main__':
    base = BaseHandle()
    base.wordcloud_by_wordcount('物流关键词词频匹配表.xlsx')
    pass

生成词云图如下:

如果大家想制作更加精美的词云图,可继续深入研究~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现PSO粒子群优化算法优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一…

Git--多人协作开发

文章目录 前言一、多人协作一开发目标将dev分支内容合并至master分支 二、多人协作二开发者1操作开发者2操作突发情况内容合并至master分支 三、解决git branch -a打印已被删除的远程分支的方法总结 前言 目前,我们所完成的工作如下 : 基本完成Git的所有本地库的相关操作,git…

学无止境·MySQL(4-2)(多表查询加强版)

多表练习试题 试题2(加强版)1、创建表2、表中添加数据3、找出销售部门中年纪最大的员工的姓名4、求财务部门最低工资的员工姓名5、列出每个部门收入总和高于9000的部门名称6、求工资在7500到8500元之间,年龄最大的人的姓名及部门7、找出销售部…

【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 / 方法 | 类内部访问私有成员 )

文章目录 一、访问私有成员1、对象无法访问私有变量2、对象无法访问私有方法3、类内部访问私有成员 一、访问私有成员 1、对象无法访问私有变量 在下面的 Python 类 Student 中 , 定义了私有的成员变量 , # 定义私有成员__address None该私有成员变量 , 只能在类内部进行访问 …

分析图中常见的这种“箭头”,如何用GIS绘制?

小伙伴们, 在各种分析图、空间结构图中, 是不是经常看到这种“扇形”的箭头, 同时伴随着一些“引绿入城”等分析语言。 于是,你有没有好奇, 这种箭头是怎么做出来的? 强大的GIS是否可以绘制出这种箭头? 还是那句话—— 别问,问就是能! 其实ArcMap 和 ArcGIS P…

【大数据实战电商推荐系统】概述版

文章目录 第1章 项目体系框架设计(说明书)第2章 工具环境搭建(说明书)第3章 项目创建并初始化业务数据3.1 IDEA创建Maven项目(略)3.2 数据加载准备(说明书)3.3 数据初始化到MongoDB …

41. 同时在线人数问题

文章目录 题目需求思路一实现一学习链接题目来源 题目需求 现有各直播间的用户访问记录表(live_events)如下。 表中每行数据表达的信息为:一个用户何时进入了一个直播间,又在何时离开了该直播间。 现要求统计各直播间最大同时在…

Stable Diffusion系列课程上:安装、提示词入门、常用模型(checkpoint、embedding、LORA)、放大算法、局部重绘、常用插件

文章目录 一、Stable Diffusion简介与安装二、文生图(提示词解析)2.1 提示词入门2.2 权重2.3 负面提示词( Negative prompt)2.4 出图参数设置2.5 新手念咒方法 三、图生图3.1 图生图入门3.2 随机种子解析3.3 图生图拓展 四、模型4…

MySQL基础篇第3章(运算符)

文章目录 1、算术运算符1.1 加法与减法运算符1.2 乘法与除法运算符1.3 求模&#xff08;求余&#xff09;运算符 2、比较运算符2.1 等号运算符2.2 安全等于<>2.3 不等于运算符2.4 空运算符2.5 非空运算符2.6 最小值运算符2.7 最大值运算符2.8 BETWEEN AND运算符2.9 IN运算…

cmake操作目录

目录 cmake如何使用子目录 demo cmake生成build目录结构 如果指定子目录编译文件名字(binaryDir) 如果指定子目录编译的路径(binaryDir) 子目录相关的作用域 demo 子目录中定义project cmake如何使用子目录 如果项目比较小的话,我们将所有源码文件放到一个目录里面是没…

wpf border控件和Effect学习

Border&#xff08;边框&#xff09;控件绘制一个边框、一个背景。 常用的属性&#xff0c; Background&#xff1a;填充 Border 边界之间的区域或者说是绘制该区域的背景&#xff0c;是一个Brush对象。 BorderBrush&#xff1a;用于绘制外部边框颜色&#xff0c;是Bru…

Vue 和 React 前端框架的比较

Vue 和 React 前端框架的比较 本文研究了流行的前端框架 Vue 和 React 之间的区别。通过对它们的学习曲线、视图层处理方式、组件化开发、响应式数据处理方式和生态系统及社区支持进行比较分析&#xff0c;得出了它们在不同方面的优劣和特点。该研究对于开发者在选择合适的前端…

QC51XX---I2c使用

QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客 今天我们聊聊I2C的使用。在开发过程中多多少少会加入一些外围传感器可以给用户带来更好的使用体验。例如,利用接近传感器识别戴上耳机和取下耳机,从而去自动暂停播放音乐,或接听转移通话。又例如,用触摸或敲击替代…

【vant】打开vant表单的正确形式(基于vant表单的二次封装)

前言 最近在用vant做关于移动端的项目,由于表单字段太多,不想写直接写到template中,这样太繁琐了,所以我们以把表单弄成schema配置形式: // data.ts import type { ItemSchema } from /typing/helper; import { StudentField } from /components; import { getDictTextByCode…

在tplink路由器xdr6088中运行Docker潘多拉(pengzhile/pandora)遇到无法访问的问题

在xdr6088中搜索安装pengzhile/pandora一切正常&#xff0c;但是按照常规运行docker后&#xff0c;直接访问8899端口无法打开页面&#xff0c;进入终端 运行如下命令 /usr/local/bin/python /usr/local/bin/pandora-cloud -s 0.0.0.0:8899 即可成功运行&#xff0c;然后客户端…

RabbitMQ在SpringBoot中的高级应用(2)

过期时间 1.单独的设置队列的存活时间,队列中的所有消息的过期时间一样 Bean//创建交换机public DirectExchange ttlQueueExchange(){// 交换机名称 是否持久化 是否自动删除return new DirectExchange("ttl_queue_log",true,false);}Bean//创建队列publ…

Swagger3学习笔记

参考https://blog.csdn.net/YXXXYX/article/details/124952856 https://blog.csdn.net/m0_53157173/article/details/119454044 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifact…

云之道知识付费V2小程序V3.1.1独立平台版安装使用教程

据播播资源了解&#xff0c;云之道知识付费小程序是一款专注于知识付费的小程序源码&#xff0c;为内容创业者、自媒体和教育培训机构提供全方位的互联网解决方案。 由播播资源小编全套安装云之道知识付费V2独立版系统&#xff0c;系统支持无限多开&#xff0c;相比上几版出现…

如何创建电子商务平台

创建一个电商平台已经变得简单而又高效&#xff0c;其中乔拓云作为一家专业的第三方平台&#xff0c;提供了丰富的模板和工具&#xff0c;帮助商家快速搭建自己的电商平台。本文将介绍如何通过乔拓云平台创建电商平台&#xff0c;并提供一些建议和注意事项。 首先&#xff0c;商…

wincc项目中VBS脚本密码的研究

文章目录 前言一、分析二、验证及使用 前言 很多时候我们在wincc中写全局脚本时会为自己的脚本添加密码&#xff0c;但很久很久以后再想修改密码忘记了怎么办呢。 一、分析 经过分析v7.0,v7.3,v7.5密码稍有不同&#xff0c;但同样最多可以设置21位的密码。 二、验证及使用