word2vec模型原理及实现词向量训练案例(二)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: word2vec模型原理及实现词向量训练案例

七、首先点击打开下方链接,然后点击红色箭头指向的红色框内容(Setup)。

grep下载官方链接:点击打开官方链接

八、正常安装解压后进行环境配置,将你bin文件夹的具体位置(博主举例是G:\GnuWin32\bin)复制,然后粘贴加到环境变量中path里面去。

九、因为content字段去除了HTML标签,保存的是新闻正文文本,也就是< content >页面内容< /content >。所以取出content字段中的内容,复制下面代码在cmd平台运行执行命令取出页面内容。(type命令表示打开文件; iconv -f gbk -t utf-8 -c命令中-f --from-code等于名称 原始文本编码,-t --to-code等于名称 输出编码,-c 从输出中忽略无效的字符,整体表示将原文件编码由gbk转换成utf-8且忽略无效的字符;grep "< content >"表示grep命令用于查找取出文件里符合< content >条件的字符串;>命令表示生成相应文件)。

type news_sohusite_xml.smarty.dat | iconv -f gbk -t utf-8 -c | grep "<content>"  > corpus.txt

十、得到文件名为corpus.txt的文件后,可以通过复制下面代码在cmd平台打开文件内容。注意:corpus.txt文件编码在上一步命令操作的时候已经由gbk编码转换成utf-8,而cmd平台默认编码为gbk,所以下面在cmd打开文件会出现乱码。

type corpus.txt

十一、为正常显示corpus.txt文件内容,需要复制下面代码在cmd平台命令行输入(65001代表编码格式为utf-8)。

chcp 65001

十二、再次通过复制下面代码在cmd平台打开文件内容。注意:cmd平台编码在上一步命令操作的时候已经由gbk编码转换成utf-8,所以下面在cmd打开文件不会出现乱码。

type corpus.txt

十三、全自动安装jieba分词器安装,复制下面代码在cmd平台中安装好pip文件中运行。

  • 注意:在安装jieba分词器首先要安装好pip,若没有安装点击打开博主的在windows系统安装pip详细过程博文:点击打开文章链接
  • 注意:若没有安装python可以点击打开博主Python3.6.3安装详细简单完整版博文:点击打开文章链接
python -m pip install jieba

十四、 jieba分词简要说明

jieba分词三种分词模式:

1、精确模式,:将句子精确切开,适合文本分析,比如清华大学就切分为”清华大学“。

2、全模式:把句子中所有的成词词语都扫描出来,速度快,但是不能解决歧义,比如清华大学可以全分为“清华/大学/清华大学”这三种可能性。

3、搜索引擎模式在精确模式的基础上,对长词再进行词切分,能短则短可分必分,提高召回率,适合搜索引擎分词,比如清华大学可以再切分为“清华/大学/清华大学”这三种可能性。

jieba分词四种主要功能:

1、 jieba.cut:该方法接受三个参数,分别是:需要分词的字符串;cut_all 参数用来控制是否采用全模式(True表示全模式,False表示精确模式,该参数默认为是False也就是精确模式);HMM参数用来控制是否适用HMM模型。

2、 jieba.cut_for_search:该方法接受两个参数,分别是:需要分词的字符串;是否使用HMM模型。这个方法适用搜索引擎构建倒排索引的分词,粒度比较细。

3、jieba.cutjieba.cut_for_search返回的结构都是可以得到的generator(生成器), 可以使用for循环来获取之前分词后的每一个词语,或者使用jieb.lcutjieba.lcut_for_search 直接返回list。

4、jieba.Tokenizer(dictionary=DEFUALT_DICT) 可以新建自定义分词器,可用于同时使用不同字典,jieba.dt为默认分词器,所有全局分词相关函数都是该分词器的映射;jieba.posseg.dt表示默认词性标注分词器,也就是分开句子以词语+词性,如:我 r。

注意:待分词的字符串编码可以是unicode或者UTF-8字符串或者GBK字符串,但是不建议直接输入GBK字符串,可能无法预料会误解码成UTF-8造成乱码。

jieba分词器添加自定义词典:

jieba分词器还有一个优点是开发者可以使用自定义词典,以便包含原词库中没有的词,虽然jieba分词可以进行新词识别,但是用自定义词典添加新词可以保证更高的正确率。使用一行代码命令:jieba.load_userdict(filename) # filename为自定义词典的文件路径。在使用的时候,词典的格式和jieba分词器本身的分词器中的词典格式必须保持一致,一个词占一行,每一行分成三部分,一部分为词语,一部分为词频,最后为词性(可以省略),用空格隔开,如:东北大学 5。

十五、jieba分词操作

利用jieba进行关键词抽取

jieba分词中含有analyse模块,在进行关键词提取时可以使用以下代码(sentence表示提取的文本字符串;topk表示返回N个TF-IDF权重下最大的关键字,默认数值是20;withWeight表示是否选择返回关键值对应的权重值,默认为False不返回;,allowPos表示筛选包含指定性的词,默认值为空也就是不筛选;idf_path表示IDF频率文件):

import jieba.analyse
jieba.analyse.extract_tags(sentence,topk=N,withWeight=False,allowPos=())
jieba.analyse.TFIDF(idf_path=None)

或者使用基于TextRank算法的关键词抽取,代码如下;

import jieba.analyse
jieba.analyse.textrank(sentence,topk=N,withWeight=False,allowPos=())
jieba.analyse.TextRank()

注意:可以使用for循环显示打印。

jieba分词进行并行运行分词

jieba分词器如果是对于大的文本进行分词会慢,因此可以使用jieba自带的并行分词功能进行分词,其采用的原理是将目标文本按照每行分开后,把各行文本分配到多个Python进程并行分词,然后归并结果,从而获得分词速度的提升。该过程需要基于python自带的multiprocessing模块。注意:目前暂时不支持windows.

十六、全自动安装 NumPy,首先复制下面代码在cmd平台中安装好pip文件中运行,最后成功验证NumPy安装成功(from numpy import * ,表示导入 numpy 库;eye(4) ,表示生成对角矩阵)。

python -m pip install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

十七、全自动安装gensim,首先复制下面代码在cmd平台中安装好pip文件中运行。

python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gensim

十八、复制下面源代码程序运行进行分词和训练操作。

"""
由原始文本进行分词后保存到新的文件
"""
import jieba
import numpy as np
filePath='G:/python/wordvec/corpus.txt' # 存储的文件位置
fileSegWordDonePath ='corpusSegDone.txt'
print('fenciqian')
# 打印中文列表
def PrintListChinese(list):
    for i in range(len(list)):
        print (list[i]) 
# 读取文件内容到列表
fileTrainRead = []
with open(filePath,'r',encoding='UTF-8') as fileTrainRaw:
    for line in fileTrainRaw:  # 按规定行读取文件
        fileTrainRead.append(line)
# jieba分词后保存在列表中
fileTrainSeg=[]
for i in range(len(fileTrainRead)):
    fileTrainSeg.append([' '.join(list(jieba.cut(fileTrainRead[i][9:-11],cut_all=False)))]) # 精确模式分词 
    if i % 100 == 0:
        print(i)
# 保存分词结果到文件中
with open(fileSegWordDonePath,'w',encoding='utf-8') as fW: # 把分词列表写入fileSegWordDonePath路径中的corpusSegDone.txt文件
    for i in range(len(fileTrainSeg)):
        fW.write(fileTrainSeg[i][0])
        fW.write('\n')
print('fencihou')
"""
gensim word2vec获取词向量
"""
import warnings
import logging
import os.path
import sys
import multiprocessing
import gensim
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
# 忽略警告
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim') # 警告扰人,手动封存
if __name__ == '__main__':
    program = os.path.basename(sys.argv[0]) # 读取当前文件的文件名,返回path最后的文件名,若path以/或\结尾,那么就会返回空值。
    # sys.argv[0]:一个从程序外部获取参数的桥梁,外部参数与程序本身没有任何数据联系,sys.arg是一个列表,第一个也就是sys.argv[0]表示程序本身,随后才依次是外部给予的参数。
    logger = logging.getLogger(program) # 获取日志对象,logging模块中最基础的对象
    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',level=logging.INFO) #  format格式:%(asctime)s: 打印日志的时间; %(levelname)s: 打印日志级别名称;%(message)s: 打印日志信息
    # level: 设置日志级别,默认为logging.WARNING,程序未按预期运行时使用,但并不是错误;logging.INFO表示程序正常运行时使用
    logger.info("running %s" % ' '.join(sys.argv))
    # inp为输入语料, outp1为输出模型, outp2为vector格式的模型
    inp = 'corpusSegDone.txt'
    out_model = 'corpusSegDone.model'
    out_vector = 'corpusSegDone.vector'
    print('chushi')
    # 训练skip-gram模型
    model = Word2Vec(LineSentence(inp), size=50, window=5, min_count=5, 
                     workers=multiprocessing.cpu_count()) # 将原始的训练语料转化成一个sentence的迭代器,每一次迭代返回的sentence是一个word(utf8格式)的列表。
    # sentences:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。
    # size:是指特征向量的维度,默认为100。
    # window:窗口大小,表示当前词与预测词在一个句子中的最大距离是多少。
    # min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉也就是不会生成词向量, 默认值为5。
    # workers:用于控制训练的并行数,multiprocessing.cpu_count()获取计算机CPU数量
    # 保存模型
    print('xunci')
    model.save(out_model)
    # 保存词向量
    model.wv.save_word2vec_format(out_vector, binary=False)

十九、复制下面源代码程序运行进行文本词向量计算分析。(博主只是举例说明,大家可以进行修改扩展功能操作分析!)

from gensim.models import KeyedVectors
from gensim.test.utils import datapath
model= KeyedVectors.load_word2vec_format(datapath('G:/python/wordvec/corpusSegDone.vector'), binary=False)
for key in model.similar_by_word('康师傅',topn=10): #注意分词时有的词语被筛选没有形成词向量,就会导致无法找到自然就无法计算分析
    print(key)

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
机器学习/深度学习 数据采集 自然语言处理
如何使用 Word2Vec 模型进行情感分析?
【10月更文挑战第5天】如何使用 Word2Vec 模型进行情感分析?
|
3月前
|
自然语言处理
【NLP】如何实现快速加载gensim word2vec的预训练的词向量模型
本文探讨了如何提高使用gensim库加载word2vec预训练词向量模型的效率,提出了三种解决方案:保存模型以便快速重新加载、仅保存和加载所需词向量、以及使用Embedding工具库代替word2vec原训练权重。
211 2
|
机器学习/深度学习 自然语言处理 算法
深度学习基础入门篇10:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}
深度学习基础入门篇10:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}
深度学习基础入门篇10:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}
|
机器学习/深度学习 自然语言处理 算法
GPT-3 vs Bert vs GloVe vs Word2vec 文本嵌入技术的性能对比测试
本文将GPT3与三种传统文本嵌入技术GloVe、Word2vec(Mikolov ,2013 年)和 BERT生成的嵌入进行性能的简单对比。
643 0
GPT-3 vs Bert vs GloVe vs Word2vec 文本嵌入技术的性能对比测试
|
机器学习/深度学习 存储 人工智能
文本深度表示模型——word2vec&doc2vec词向量模型
NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
文本深度表示模型——word2vec&doc2vec词向量模型
|
机器学习/深度学习 Serverless Windows
word2vec模型原理及实现词向量训练案例(一)
word2vec模型原理及实现词向量训练案例
241 0
word2vec模型原理及实现词向量训练案例(一)
|
机器学习/深度学习 存储 数据采集
词向量word2vec(图学习参考资料1)
词向量word2vec(图学习参考资料1)
|
机器学习/深度学习 存储 人工智能
NLP教程(1) - 词向量、SVD分解与Word2Vec
本文介绍自然语言处理(NLP)的概念及其面临的问题,进而介绍词向量和其构建方法(包括基于共现矩阵降维和Word2Vec)。
1374 1
NLP教程(1)  -  词向量、SVD分解与Word2Vec
|
机器学习/深度学习 自然语言处理 Python
①机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)
机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)
567 0
①机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)
|
机器学习/深度学习 自然语言处理
②机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)
机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)
376 0
②机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)