Pyspark Word2Vec + jieba 训练词向量流程

摘要:用商品描述为语料库训练商品词向量为例,分享一下用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

此处自定义词典直接通过spark读取,格式为spark的dataframe,只有一列'word'字段,将其直接转化为pandas数据框后,使用jieba.add_word逐条加载.

user_dic=spark.sql("select * from user_dict")

dic=user_dic.toPandas()

for i in np.arange(dic.shape[0]):

    jieba.add_word(dic['word'][i].strip())

从pyspark中import如下部分:

from pyspark.sql.types import StringType,ArrayType

from pyspark.sql.functions import udf

定义udf,把jieba分词包装起来,返回一个pyspark可识别的arraytype,array中的基元素是stringtype的:

def seg(x):

    jieba_seg_generator=jieba.cut(x, cut_all=False)

    words = []

    for word in jieba_seg_generator:

        if  len(word)>1:

            words.append(word)

    return words

seg_udf = udf(seg, ArrayType(StringType()))

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)

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

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字段就是商品描述的文本向量形式了,大工告成.之后可以进行相似度计算或者作为特征进入其他模型.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,448评论 0 13
  • jieba分词,学习,为了全面了解该模块,,预设学习路线:官方文档——优秀博客文章——实践学习 官方文档部分 (文...
    竹林徒儿阅读 4,082评论 1 12
  • 计算机只能识别和计算数字,我们在处理语言文本时(不仅语言文本,要传入模型计算的数据都是数字或者向量),首要的工作是...
    Zimix阅读 11,909评论 0 9
  • 目录 方法概述 分词——Jieba 词频分析与词云 方法概述 1、使用歌曲《山僧》的歌词片段为素材,进行分析。 经...
    Hana_5f9b阅读 1,463评论 0 1
  • 注:参考文档 一、在线词云图工具# (1)、使用### 在正式使用jieba分词之前,首先尝试用在线分词工具来将自...
    DearIreneLi阅读 6,028评论 1 8