Word2Vec

       以前对于文本类型的数据,都是通过tf-idf进行处理的,这个可以参见以前写的博客,这里就不在详细介绍了。最近项目组老大跟我说了word2vec这种文本型特征提取的方式。特地给我讲解了一下俩者之间的区别:

      一个词经过tf-idf处理之后,是一个数字,如果是相近的词语,它是无法区分的。Word2Vec就不一样了,比如研究和科研这俩个词,经过Word2Vec处理之后,是向量的形式。科研:[1,0,0,1,0],研究[1,0,0,0.8,0]。是可以判断是否相近的。

      对于概念,我在spark官网翻译了一段话:计算一系列词的分布式向量。分布式的主要优点是相近的词在向量空间中是相近的,使泛化的新模式更容易和模型的评估更强大。分布式向量显示在许多自然语言处理应用中是有用的。命名实体类别,消歧。解析,标注和机器翻译。

代码如图:

package com.iflytek.features import org.apache.spark.ml.feature.Word2Vec import org.apache.spark.ml.linalg.Vector import org.apache.spark.sql.Row import org.apache.spark.sql.SparkSession object wordtovec {   def main(args: Array[String]): Unit = {       val spark=SparkSession.builder().appName("pca").master("local").getOrCreate()       // Input data: Each row is a bag of words from a sentence or document.       val documentDF = spark.createDataFrame(Seq(         "Hi I heard about Spark".split(" "),         "I wish Java could use case classes".split(" "),         "Logistic regression models are neat".split(" ")          ).map(Tuple1.apply)).toDF("text")

      // Learn a mapping from words to Vectors.       val word2Vec = new Word2Vec()         .setInputCol("text")         .setOutputCol("result")         .setVectorSize(3)         .setMinCount(0)

      val model = word2Vec.fit(documentDF)

      val result = model.transform(documentDF)       result.select("result").take(3).foreach(println)       val vecs=model.getVectors       vecs.foreach { x => println(x.apply(0)+":"+x.apply(1))}       val synonyms =model.findSynonyms("are", 3)         synonyms.select("word", "similarity").foreach { x => println(x.apply(0)+":"+x.apply(1)) }   } }

result的输出结果:

[[-0.028139343485236168,0.04554025698453188,-0.013317196490243079]] [[0.06872416580361979,-0.02604914902310286,0.02165239889706884]] [[0.023467857390642166,0.027799883112311366,0.0331136979162693]]

vecs的输出结果:

heard:[-0.053989291191101074,0.14687322080135345,-0.0022512583527714014] are:[-0.16293057799339294,-0.14514029026031494,0.1139335036277771] neat:[-0.0406828410923481,0.028049567714333534,-0.16289857029914856] classes:[-0.1490514725446701,-0.04974571615457535,0.03320947289466858] I:[-0.019095497205853462,-0.131216898560524,0.14303986728191376] regression:[0.16541987657546997,0.06469681113958359,0.09233078360557556] Logistic:[0.036407098174095154,0.05800342187285423,-0.021965932101011276] Spark:[-0.1267719864845276,0.09859133511781693,-0.10378564894199371] could:[0.15352481603622437,0.06008218228816986,0.07726015895605087] use:[0.08318991959095001,0.002120430115610361,-0.07926633954048157] Hi:[-0.05663909390568733,0.009638422168791294,-0.033786069601774216] models:[0.11912573128938675,0.1333899050951004,0.1441687047481537] case:[0.14080166816711426,0.08094961196184158,0.1596144139766693] about:[0.11579915136098862,0.10381520539522171,-0.06980287283658981] Java:[0.12235434353351593,-0.03189820423722267,-0.1423865109682083] wish:[0.14934538304805756,-0.11263544857501984,-0.03990427032113075]

synonyms的输出:

classes:0.8926231541787831 I:0.8009102388269147 Hi:0.24258211195587995

getVectors:得到语料中所有词及其词向量

transform:将训练语料中,一行,也就是一个句子,表示成一个向量。它的处理方式是,对句子中所有的词向量取平均作为句子的向量表示,最native的表示方法。

findSynonyms("are",3):得到的是与词are相近的3个词。

经过我的实际测试,发现使用Word2Vector可以提高各项评价指标,大家也不妨试试啊。

spark2.0的分类、回归、聚类算法我都测试了一遍,只有分类的朴素贝叶斯是行不通的(特征值不接受负的),其他的都是行的通的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技大本营的专栏

技术详解 | 如何用GAN实现阴影检测和阴影去除?

作者 | 江亦凡 最近两天刚看到的论文,写一篇文章当做笔记,论文原文取自https://arxiv.org/abs/1712.02478 继去年底Phillip...

3555
来自专栏深度学习自然语言处理

这些神经网络调参细节,你都了解了吗

今天在写本科毕业论文的时候又回顾了一下神经网络调参的一些细节问题,特来总结下。主要从weight_decay,clip_norm,lr_decay说起。

892
来自专栏计算机视觉

sketch to photo基于检索篇ABCD-sketch retrievalE-跨域细粒度检索

1702
来自专栏程序员叨叨叨

2.3 光栅化阶段

光栅化:决定哪些像素被集合图元覆盖的过程(Rasterization is the process of determining the set of pixe...

613
来自专栏何俊林

OpenGL ES总结(二)OpenGL坐标变换之平移及旋转

导读:OpenGL是在图形图像中,非常优秀的渲染库,文中Demo下载地址:https://github.com/hejunlin2013/OpenGLCoord...

34410
来自专栏YoungGy

JPEG算法概述及实现

本文将简单介绍下JPEG算法的实现流程,包括图像分割、颜色空间转换、DCT、Quantization、Huffman coding等。 JPEG概述 图像压缩很...

2149
来自专栏大数据杂谈

【Excel系列】Excel数据分析:时间序列预测

移动平均 18.1 移动平均工具的功能 “移动平均”分析工具可以基于特定的过去某段时期中变量的平均值,对未来值进行预测。移动平均值提供了由所有历史数据的简单的平...

3769
来自专栏专知

机器翻译新时代:Facebook 开源无监督机器翻译模型和大规模训练语料

【导读】基于深度学习的机器翻译往往需要数量非常庞大的平行语料,这一前提使得当前最先进的技术无法被有效地用于那些平行语料比较匮乏的语言之间。为了解决这一问题,Fa...

43811
来自专栏算法+

传统高斯模糊与优化算法(附完整C++代码)

高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果...

5465
来自专栏Python数据科学

数据分析实战—北京二手房房价分析(建模篇)

本篇将继续上一篇数据分析之后进行数据挖掘建模预测,这两部分构成了一个简单的完整项目。结合两篇文章通过数据分析和挖掘的方法可以达到二手房屋价格预测的效果。

942

扫码关注云+社区