以前对于文本类型的数据,都是通过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的分类、回归、聚类算法我都测试了一遍,只有分类的朴素贝叶斯是行不通的(特征值不接受负的),其他的都是行的通的。
Original url: Access
Created at: 2019-01-28 10:18:35
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论