如何在jieba分词中加自定义词典_Pyspark Word2Vec + jieba 训练词向量流程

2fda783eb471c406fd05c2a7efef2c46.png

摘要:用商品描述为语料库训练商品词向量为例,分享一下用pyspark自带word2vec+jieba分词训练词向量的流程.

工具:python,pyspark,jieba,pandas,numpy

数据格式:自定义词典,语料库均为pyspark dataframe,停用辞典不大,直接使用txt.

1 create spark

我的pyspark参数设置如下:

def create_spark():sparkconf = SparkConf('jianwangzhilai') .setAppName("jianwangzhilai") .set("spark.sql.catalogImplementation","hive") .set("spark.dynamicAllocation.enabled", "false") .set("spark.shuffle.service.enabled", "false") .setExecutorEnv("JAVA_HOME", os.environ["JAVA_HOME"]) .setExecutorEnv("HADOOP_HDFS_HOME", os.environ["HADOOP_HOME"]) .setExecutorEnv("LD_LIBRARY_PATH", os.environ["LD_LIBRARY_PATH"] ) .setExecutorEnv("CLASSPATH", os.environ["CLASSPATH"])sparkconf.set("spark.executor.instances", '64')) .set("spark.executor.cores", '8' .set("spark.cores.max",'512') .set("spark.executor.memory",'10g') .set("spark.driver.maxResultSize", "4g")spark=SparkSession.builder.enableHiveSupport().config(conf=sparkconf).getOrCreate()spark.sparkContext.setLogLevel('WARN')print('spark created...')return spark

设置有点琐碎,但大同小异,唯一需要注意的是,spark.driver.maxResultSize这个参数最好设置大于1g.

2 自定义词典,udf

此处自定义词典需要注意,pyspark存在和jieba不兼容的情况,需要先做如下操作:

##user dict

从pyspark中import如下部分:

from 

定义udf,把jieba分词包装起来,返回一个pyspark可识别的arraytype,array中的基元素是stringtype的,这里需要注意,udf函数中只要jieba.dt.initialized发现没有加载自定义词典,都要重新加载一次,否则不会报错但是会出现分词没有使用自定义词典的情况:

def 

3 语料库分词

商品的语料同样通过spark.sql读取

corpus_goods = spark.sql("select * from corpus_goods_description ").cache()

同样,格式为spark dataframe,包含一个主键商品id和一个商品描述description.

利用之前打包的udf,对商品描述进行分词,生成一个新列seg:

corpus_goods = corpus_goods.withColumn('seg',seg_udf(corpus_goods['description']))

4 停用词

停用词因为较少,这里直接保存成了txt格式,读取成list:

stop_words=open('./stopwords.txt', 'r', encoding='utf_8').readlines()
stop_words = [line.strip() for line in stop_words]

停用词去除可以自己写好,一起打包到之前的udf中,只要在seg函数中稍作改变:

        if  len(word)>1 and word not in stop_words:words.append(word)

也可以通过pyspark自带模块进行去除:

from pyspark.ml.feature import StopWordsRemover
remover = StopWordsRemover(inputCol="seg", outputCol="words", stopWords=stop_words)               
corpus_goods = remover.transform(corpus_goods)

这里推荐后一种方法.去除停用词后,基本可以进行训练了,此时语料库是这个样:

81a6389e4d9d3634ecdf1e40c3079ca3.png

5 词向量训练

语料分词后,直接进行如下训练:

from pyspark.ml.feature import Word2Vec
w2v = Word2Vec(vectorSize=100, minCount=3,seed=123, numPartitions=64,inputCol="words", outputCol="result")
model = w2v.fit(corpus_goods)
model.getVectors().head(2)
model.getVectors().count()
##save
path = "./models/word2vec"
model.write().overwrite().save(path)

训练很简单,注意numPartitions参数,这个参数默认是1,如果使用默认参数,等于只有一个job进行fit,如果数据很大,这个过程将会非常漫长,这里我设置成和instances相同的大小,也可以设置成其他合适的大小,具体看机器配置.

minCount参数控制了词频,词频低于这个字段的将会被舍弃.vectorSize控制了向量的大小,一般超过50.

词向量训练完成后,得到了每个词的向量表示,此时需要把整个商品的描述也表示成向量,如果自己实现也可,但是pyspark直接一行搞定,速度飞快:

corpus_goods = model.transform(corpus_goods)

此时,corpus_goods数据框中,result字段就是商品描述的文本向量形式了,大工告成.之后可以进行相似度计算或者作为特征进入其他模型.

6 商品相似度计算

补充一下相似度计算的坑.

spark中暂时时发现通过笛卡尔积的形式计算所有商品的相似度.

df = corpus_goods .crossJoin(corpus_goods ).toDF('id1','result','id2','result2')

之后通过定义udf,计算余弦夹角.

from 

这里直接引用了scipy的余弦距离,用1减去之后就是余弦相似度.

注意,必须用float函数包一下结果,因为如果直接返回计算出的余弦相似度,格式是numpy.float64的,udf中returnType=FloatType(),会引起不兼容,所以必须返回一个python的float格式.

最后相似度保存hive:

df.write.format('orc').mode('overwrite').saveAsTable(table_name)

至此,完结~

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

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

相关文章

linux底行模式显示信息,14天linux命令加强

linux命令加强linux命令加强.jpg复习cd./ 当前目录../ 上级目录/ 代表根目录 or 代表目录和文件之间的分隔符 ..pwd 查看当前路径LS 查看当前目录下的文件ls ./a/ 查看目标路径下的文件tab 自动补全grep 文件外部根据关键字搜索文件内容 grep -n 关键字 *(文件名)more 以分页的…

字节和位 B和b的区别

“B”不是最小的单位,“B”是Byte的意思,一个Byte等于8个bit(位),bit是最小的单位。 就好像你用宽带上网,1M、2M、10M、100M都是用bit来作为单位的,实际上以上的速度换算到B是都要除上8。 bit一…

AndroidManifest.xml详解

我们在进行APP开发的时候都会遇到一个文件:AndroidManifest.xml。从刚开始进行Android开发,到现在已经过去了几个月,还是对这个文件一知半解,只知道它是配置用的。但是这文件里的东西具体有什么用,该怎么用一直都没有理…

a标签传值到另一个页面_vue-router页面传值及接收值

前端写页面&#xff0c;我们经常需要从A页面传值给B页面&#xff0c;比如下面的场景点击“充值中”跳转到下一个页面&#xff0c;使tabbar中的页面与其对应需要上个页面传值下面来实现下&#xff1a;A页面——My.vue在去“order”页面的方法中通过params传值current1<B页面—…

本机ping不通虚拟机linux,Windows本地Linux虚拟机ping不通的解决办法

安装linux操作系统安装双操作系统; 1 0. 介绍: 1 1 实验环境: 2 2. 实验准备: 2 3.开始安装: 2 1 制作U盘启动工具: 2 2.安装LinuxOS. 3 2.1在windowOS中划分60G空间 ...VS2008编译bat工程文件为AirCode,批处理文件为bulit.bat(与*.sln文件在同级目录). 以下是批处理的代码: ec…

如何实现文件互拖-VMware Tools (ubuntu系统)安装详细过程与使用

VMware Tools &#xff08;ubuntu系统&#xff09;安装详细过程与使用 1、打开虚拟机VMware Workstation&#xff0c;启动Ubuntu系统&#xff0c;菜单栏 - 虚拟机 - 安装VMware Tools&#xff0c;不启动Ubuntu系统是无法点击“安装VMware Tools”选项的&#xff0c;如下图&…

c++ 中文乱码_Visual Studio Code 中 CodeRunner 插件的输出窗口中文乱码

原来我一直用 Pycharm 写代码&#xff0c;Pycharm 写代码虽然很方便&#xff0c;但是Pycharm 有点重&#xff0c;我转到了Vscode了&#xff0c;真香。在 Visual Studio Code 中安装 CodeRunner 插件后&#xff0c;直接运行 Python 代码的时候&#xff0c;输出窗口中的中文出现了…

linux 下 java md5值,MD5值的简介和查看

MD5即Message-Digest Algorithm 5(信息-摘要算法第5版)&#xff0c;用于确保信息传输完整一致。每个文件都可以用MD5验证程序算出一个固定的MD5码来。MD5在论坛上、软件发布时经常用&#xff0c;是为了保证文件的正确性&#xff0c;防止一些人盗用程序&#xff0c;加些木马或者…

解决为什么导入了tomcat进入myeclipse却在server中找不到

有时候在servers中找不到刚刚在preferences搜索框中&#xff0c;输入tomcat等等等一系列的操作后却还是找不到在哪里 其实需要在servers窗口中右键new一个新的tomcat出来&#xff0c;这时候再在里面选择刚刚新建的tomcat即可

三菱modbusRTU通讯实例_实例 | 三菱PLC接线图干货,FX5U模块硬件

点击箭头处“工业之家”&#xff0c;选择“关注公众号”&#xff01;三菱PLC接线图干货此次主要描述的是关于三菱FX5U 模块硬件的接线实例&#xff0c;主要有以下几个方面&#xff1a;电源AC、DC接线、输入输出接线、模拟量接线。不同原理不同的接线方式&#xff0c;现在来给大…

linux共享文件系统sy,Linux使用Samba实现文件共享

Samba服务是现在Linux系统与Windows系统之间共享文件的最佳选择。[rootstudy ~]# yum install samba -y  #安装samba服务[rootstudy ~]# cat -n /etc/samba/smb.conf  #查看samba主配置文件Samba服务程序中的参数以及作用[global]参数作用workgroup MYGROUP#工作组名称ser…

recycleviewitem 列表加载动画_用vue实现一个虚拟列表

上次分享了超长列表分片加载的方式&#xff0c;这种方式现在一般不会使用&#xff0c;因为dom会变的无比庞大&#xff0c;页面会很卡&#xff0c;今天分享用vue实现一个虚拟列表的简易实现&#xff0c;本来是想用原生实现一个&#xff0c;后来觉得直接使用computed&#xff0c;…

解决为什么JDK要带着JRE一起下载

相信在安装的过程中会遇到这么一个疑问&#xff0c;明明我安装的的是JDK&#xff0c;为什么下载完成后路径里面多了一个jre呢&#xff1f; 带着这个疑问&#xff0c;我们探究一下JDK和JRE的区别 JDK&#xff1a;它是Java开发运行环境&#xff0c;在程序员的电脑上当然要安装J…

linux 安装jdk gz文件,Linux 安装jdk gz 安装方式

Linux安装JDK步骤1、先从网上下载jdk(jdk-7u1-linux-i586.rpm)&#xff0c;下载地址:http://www.Oracle.com/technetwork/Java/javase/downloads/jdk-7u1-download-513651.html&#xff0c;下载后放在/home目录中&#xff0c;当然其它地方也行。2、进入安装目录#cd /home#cp jd…

多元相关性分析_研究 | 精神分裂症症状与超氧化物歧化酶相关性的性别差异

精神分裂症是一种精神病综合征&#xff0c;主要症状包括阳性症状(如幻觉、妄想以及言语混乱)&#xff0c;阴性症状(如积极性降低、表达能力下降)&#xff0c;认知缺陷(如执行功能、记忆能力和心理处理速度受损)。氧化应激过度、抗氧化防御系统失调被认为是精神分裂症的重要危险…

安装Android studio打不开,提示the environment variable HAVA_HOME does not point to a val

遇到问题先仔细看错误提示&#xff0c;这里的意思有提到JAVA_HOME&#xff0c;因此需要我们打开一下系统的环境变量 1.java_home里面只有一个值&#xff0c;但在后面加了分号&#xff1a; 运行Java程序的时候不会报错。但是Android studio会认为不是一个正确的地址。 2.盘符问…

linux system更好方法,Linux将程序添加到服务的方法(通用【但最好还是用systemd】)...

一&#xff1a;咱们通过这篇文章来演示怎么将某个程序作为服务(就类似Windows服务可以开机自动启动)&#xff0c;这里以tomcat为例&#xff0c;已经亲测过&#xff1b;二&#xff1a;步骤(最好用root用户来做这种事情&#xff0c;切换root用户记得su - root)1)在/etc/rc.d/init…

获取显示器的唯一编号_宝马奔驰才配拥有的HUD抬头显示器,买菜车也能无损安装!...

其实现在许多中高端车(壕车)已经开始标配或者可以选配抬头显示器&#xff0c;比如宝马现在全系好像都可以选配&#xff0c;我朋友有一台X3就带HUD&#xff0c;听说选配HUD时追加了1.3万。那HUD有什么作用呢&#xff1f;没用过的人可能会说装X大于实用&#xff0c;其实真正用过H…

JAVA入门级教学之(Object类中的equals方法)

package com.lbj.javase18; /** * 关于Object中的equals方法&#xff1a; * * Object中的equals方法(核心)&#xff1a; * public boolean equals(o2){ * return(thisobj);//相当于return(o1o2);中间跟的是双等号&#xff0c;两边引用地址内存相同则true&#xff0c…

g100显卡 linux驱动,nvidia geforce g100驱动

这是nvidia geforce g100驱动下载&#xff0c;一款可以有效解决NVIDIA GeForce G100显卡在使用过程中出现的一些问题的驱动工具&#xff0c;本站提供了NVIDIA GeForce G100显卡驱动的下载地址&#xff0c;有兴趣的朋友们可以前来下载使用。软件说明1、支持GeForce GTS 240、GT …