Word2Vec在中文的应用
google最近新开放出word2vec项目,该项目使用deep-learning技术将term表示为向量,由此计算term之间的相似度,对term聚类等,该项目也支持phrase的自动识别,以及与term等同的计算。
word2vec(word to vector)顾名思义,这是一个将单词转换成向量形式的工具。通过转换,可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。
具体的原理还没有去了解,在这里谈一下怎么个应用法
- 分词
1) 本人下载的是搜狗实验室的互联网媒体新闻语料,先从语料中提取出每篇文章的正文,在提取的过程中进行过滤操作,因为同一篇文章可能被多个媒体报道,如果不对文章进行排重的话,会对最终的结果有一些影响,从过滤的结果上看,100篇文章中大概有35篇是出现不止一次的,所以这一步还是挺必要的。
2) 提取出正文后进行分词,且在分词过程中统计词频,因为Word2Vec在运行过程中,占用内存的大小是由独立词的个数决定的,所以统计完词频后将分词后的结果中的低频词去掉,在不去掉的情况下,大概要用到20G的内存空间,而只取前10万个高频词的时候只需要1G的空间就可以了。本人用的是FudanNLP的开源分词软件,分词速度还可以,大概300k/s,在i5-3470,8G内存的平台上进行。不过美中不足的是分词的正确率感觉不大高,很多长词被拆分成短词了,估计是词库的问题。
具体的代码如下:
新闻结构存储
package cn.com.juefan.word2vec; import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Word2VecData { public String TEXT = new String();
public String urlString = new String();
public String titleString = new String();
public String contentString = new String(); public Word2VecData(String string){
TEXT = string;
urlString = match("url" );
titleString = match("contenttitle");
contentString = match("content"); } /**
* 匹配提取出内容
* @param string 搜狗数据集(一行)
* @return 提取的有效内容
*/
public String match(String string){
String regex = "<" + string + ">" + ".*?" + "</" + string + ">";
Pattern p = Pattern.compile(regex, Pattern.CANON_EQ);
Matcher matcher = p.matcher(TEXT);
while(matcher.find()){
return matcher.group().replace("<" + string + ">" , "").replace("</" + string + ">", "");
}
return null;
} } }
正文提取与存储
package cn.com.juefan.word2vec; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set; import edu.fudan.juefan.personer.StopWord;
import edu.fudan.ml.types.Dictionary;
import edu.fudan.nlp.cn.tag.CWSTagger;
import edu.fudan.nlp.cn.tag.POSTagger; public class SplitContent { /**
* 将指定内容写入指定文件中
* 以追加的方式写入
* @param fileWriter 文件路径
* @param context 存储内容
* @param bool 是否覆盖写入
*/
public static void FileWrite(String fileName, String context, boolean bool){
try{
@SuppressWarnings("resource")
FileWriter fileWriter = new FileWriter(fileName, bool);
fileWriter.write(context);
fileWriter.flush();
}catch (Exception e) {
}
} public static void main(String[] args) throws Exception {
Set<String> set = new HashSet<String>();
/**加载分词器*/
CWSTagger tag2 = new CWSTagger("./models/seg.m");
String fileNameString = "\\output\\sogou\\SplitContent_"; /**加载停用词
* 该类是自己写的,个人可以自己写一个,主要是对分词后的结果进行过滤操作
*/
StopWord stopWord = new StopWord();
int TRAC = 0;
int NUM = 0;
StringBuilder builder = new StringBuilder();
BufferedReader reader = null;
try{
/**读取搜狗语料*/
File fileScanner = new File(System.getProperty("user.dir") + "\\input\\news_tensite_xml.txt"); if(new File(System.getProperty("user.dir") + "\\input\\news_tensite_xml.txt").exists()){
System.out.println("正在读取文件......");
InputStreamReader isr = new InputStreamReader(new FileInputStream(fileScanner), "GBK");
reader = new BufferedReader(isr);
String tmString = null;
while((tmString = reader.readLine()) != null){
builder = builder.append(tmString); /**搜狗语料的结构为每6行构成一篇报道*/
if(++TRAC % 6 == 0){
Word2VecData data = new Word2VecData(builder.toString());
if(!set.contains(data.contentString)){
/**上面是判断该新闻是否与出现过,下面是将分词后的结果进行停用词过滤操作,且每50000篇文章为一个小文件*/
stopWord.Filtration(tag2.tag(data.contentString));
FileWrite(System.getProperty("user.dir") + fileNameString + Integer.toString(NUM++ / 50000), stopWord.builder.toString() + "\n", true);
set.add(data.contentString);
if(NUM % 10000 == 0)
System.out.println(NUM);
}
builder.delete(0, builder.length());
}
}
System.out.println("读取文件成功!");
}
}catch (Exception e) {
System.out.println("文件不存在!");
}
} }
==================久违了,写一下Word2Vec的操作====================
上面的是语料的分词,接下来就利用分词后的语料进行Word2Vec的训练了
步骤1:
首先要做的肯定是从官网上下载word2vec的源码:http://word2vec.googlecode.com/svn/trunk/ ,然后把其中makefile文件的.txt后缀去掉,在终端下执行make操作,这时能发现word2vec文件夹下多了好几个东西。
如果make不成功的话,需要修改makefile的内容,把第四行修改为
CFLAGS = -lm -pthread -O2 -Wall -funroll-loops
然后再进行make编译,这回估计就能成功了!
步骤2:
对语料进行训练,在Word2Vec文件夹下会有一个word2vec程序,执行
./word2vec sougo.txt vertors.bin
./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1
此时将会训练生成词向量文件vertors.bin
步骤3:
调用vertors.bin文件输出词的相似词结果,执行
[juefan@xxx Word2Vec]$ ./distance vectors.bin
Enter word or sentence (EXIT to break):
此时只要输入一个词,就能够输出对应的相关词了
参数说明:
参数解释:
-train 训练数据
-output 结果输入文件,即每个词的向量
-cbow 是否使用cbow模型,0表示使用skip-gram模型,1表示使用cbow模型,默认情况下是skip-gram模型,cbow模型快一些,skip-gram模型效果好一些
-size 表示输出的词向量维数
-window 为训练的窗口大小,8表示每个词考虑前8个词与后8个词(实际代码中还有一个随机选窗口的过程,窗口大小<=5)
-negative 表示是否使用NEG方,0表示不使用,其它的值目前还不是很清楚
-hs 是否使用HS方法,0表示不使用,1表示使用
-sample 表示 采样的阈值,如果一个词在训练样本中出现的频率越大,那么就越会被采样
-binary 表示输出的结果文件是否采用二进制存储,0表示不使用(即普通的文本存储,可以打开查看),1表示使用,即vectors.bin的存储类型
除了上面所讲的参数,还有:
-alpha 表示 学习速率
-min-count 表示设置最低频率,默认为5,如果一个词语在文档中出现的次数小于该阈值,那么该词就会被舍弃
-classes 表示词聚类簇的个数,从相关源码中可以得出该聚类是采用k-means
晒一下结果出来给大家看下。。。
没有做过对比,不过个人感觉这个效果是挺不错的了。。。。点赞!
http://blog.csdn.net/baidu_26550817/article/details/48653889
Word2Vec在中文的应用的更多相关文章
- word2vec 构建中文词向量
词向量作为文本的基本结构——词的模型,以其优越的性能,受到自然语言处理领域研究人员的青睐.良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,本文 ...
- 使用word2vec训练中文词向量
https://www.jianshu.com/p/87798bccee48 一.文本处理流程 通常我们文本处理流程如下: 1 对文本数据进行预处理:数据预处理,包括简繁体转换,去除xml符号,将单词 ...
- word2vec训练中文模型
-- 这篇文章是一个学习.分析的博客 --- 1.准备数据与预处理 首先需要一份比较大的中文语料数据,可以考虑中文的维基百科(也可以试试搜狗的新闻语料库).中文维基百科的打包文件地址为 https: ...
- Windows下基于python3使用word2vec训练中文维基百科语料(二)
在上一篇对中文维基百科语料处理将其转换成.txt的文本文档的基础上,我们要将为文本转换成向量,首先都要对文本进行预处理 步骤四:由于得到的中文维基百科中有许多繁体字,所以我们现在就是将繁体字转换成简体 ...
- 使用word2vec对中文维基百科数据进行处理
一.下载中文维基百科数据https://dumps.wikimedia.org/zhwiki/并使用gensim中的wikicorpus解析提取xml中的内容 二.利用opencc繁体转简体 三.利用 ...
- Windows下基于python3使用word2vec训练中文维基百科语料(三)
对前两篇获取到的词向量模型进行使用: 代码如下: import gensim model = gensim.models.Word2Vec.load('wiki.zh.text.model') fla ...
- Windows下基于python3使用word2vec训练中文维基百科语料(一)
在进行自然语言处理之前,首先需要一个语料,这里选择维基百科中文语料,由于维基百科是 .xml.bz2文件,所以要将其转换成.txt文件,下面就是相关步骤: 步骤一:下载维基百科中文语料 https:/ ...
- 用中文把玩Google开源的Deep-Learning项目word2vec
google最近新开放出word2vec项目,该项目使用deep-learning技术将term表示为向量,由此计算term之间的相似度,对term聚类等,该项目也支持phrase的自动识别,以及与t ...
- word2vec词向量训练及中文文本类似度计算
本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...
随机推荐
- CQRS
CQRS 2015-06-04 15:33 by 敏捷的水, 177 阅读, 0 评论, 收藏, 编辑 CQRS是Command Query Responsibility Seperation(命令查 ...
- Android开发新手教程--Android应用程序结构
一.新HelloWorld工程: 1.打开Eclipse.点击"File"->"New"->"Project"-Android ...
- Postman 是一个非常棒的Chrome扩展,提供功能强大的API & HTTP 请求调试
Postman 是一个非常棒的Chrome扩展,提供功能强大的API & HTTP 请求调试 需要FQ才能安装,使用时应该不用FQ了,除非使用postman的历史记录功能: 非常棒的C ...
- CSS3+HTML5特效1 - 上下滑动效果
先看看效果,把鼠标移上去看看. back front 1. 本实例需要以下元素: a. 外容器 box b. 内容器 border c. 默认显示内容 front d. 滑动内容 back 2. 外容 ...
- AngularJS应用开发思维之1:声明式界面
这篇博客之前承接上一篇:http://www.cnblogs.com/xuema/p/4335180.html 重写示例:模板.指令和视图 AngularJS最显著的特点是用静态的HTML文档,就可以 ...
- NSNotification、delegate和KVO的区别
1.效率:delegate比nsnotification高.2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是delegat ...
- JS常用的标准函数
原文:JS常用的标准函数 1.Array类型函数 array.concat(item...) 函数功能:关联数组,实现数组相加功能,但并不影响原先数组,concat返回新数组. array.join( ...
- jQuery.extend()源码解读
// extend方法为jQuery对象和init对象的prototype扩展方法// 同时具有独立的扩展普通对象的功能jQuery.extend = jQuery.fn.extend = funct ...
- MyEclipse 设置全部jsp的编码为UFT-8 的方法
- Java获取系统相关信息System.getProperty()
java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目 ...