NLP之word2vec:利用 Wikipedia Text(中文维基百科)语料+Word2vec工具来训练简体中文词向量(二)

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: NLP之word2vec:利用 Wikipedia Text(中文维基百科)语料+Word2vec工具来训练简体中文词向量

实现代码




对下边文件代码的说明


#We create word2vec model use wiki Text like this https://dumps.wikimedia.org/zhwiki/20161001/zhwiki-20161001-pages-articles-multistream.xml.bz2

##parameter:

=================================

   feature_size = 500

   content_window = 5

   freq_min_count = 3

   # threads_num = 4

   negative = 3   #best采样使用hierarchical softmax方法(负采样,对常见词有利),不使用negative sampling方法(对罕见词有利)。

   iter = 20

##process.py deal with wiki*.xml

##word2vec_wiki.py : create model and load model


1、process.py文件


#process.py文件

import logging

import os.path

import sys

from gensim.corpora import WikiCorpus

#run python process_wiki.py ../data/zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text

if __name__ == '__main__':

   program = os.path.basename(sys.argv[0])

   logger = logging.getLogger(program)

   logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')

   logging.root.setLevel(level=logging.INFO)

   logger.info("running %s" % ' '.join(sys.argv))

   # check and process input arguments

   if len(sys.argv) < 3:

       print(('globals()[__doc__]):', globals()['__doc__']) )

       print('locals:', locals())

       print(globals()['__doc__'] % locals())    #最初代码 print globals()['__doc__'] % locals()

       sys.exit(1)

   inp, outp = sys.argv[1:3]

   space = " "

   i = 0

   output = open(outp, 'w')

   wiki = WikiCorpus(inp, lemmatize=False, dictionary={})

   for text in wiki.get_texts():

       output.write(space.join(text) + "\n")

       i = i + 1

       if (i % 10000 == 0):

           logger.info("Saved " + str(i) + " articles")

   output.close()

   logger.info("Finished Saved " + str(i) + " articles")

2、word2vec_wiki.py文件


#word2vec_wiki.py文件

# -*- coding:utf-8 -*-

from __future__ import print_function

import numpy as np

import os

import sys

import jieba

import time

import jieba.posseg as pseg

import codecs

import multiprocessing

import json

# from gensim.models import Word2Vec,Phrases

from gensim import models,corpora

import logging

# auto_brand = codecs.open("Automotive_Brand.txt", encoding='utf-8').read()

sys.path.append("../../")

sys.path.append("../../langconv/")

sys.path.append("../../parser/")

# import xmlparser

# from xmlparser import *

# from langconv import *

# logger = logging.getLogger(program)

logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')

logging.root.setLevel(level=logging.INFO)

# logger.info("running %s" % ' '.join(sys.argv))

def json_dict_from_file(json_file,fieldnames=None,isdelwords=True):

   """

   load json file and generate a new object instance whose __name__ filed

   will be 'inst'

   :param json_file:

   """

   obj_s = []

   with open(json_file) as f:

       for line in f:

           object_dict = json.loads(line)

           if fieldnames==None:

               obj_s.append(object_dict)

           else:

               # for fieldname in fieldname:

                   if set(fieldnames).issubset(set(object_dict.keys())):

                       one = []

                       for fieldname in fieldnames:

                           if isdelwords and fieldname == 'content':

                               one.append(delNOTNeedWords(object_dict[fieldname])[1])

                           else:

                               one.append(object_dict[fieldname])

                       obj_s.append(one)

   return obj_s

def delNOTNeedWords(content,customstopwords=None):

   # words = jieba.lcut(content)

   if customstopwords == None:

       customstopwords = "stopwords.txt"

   import os

   if os.path.exists(customstopwords):

       stop_words = codecs.open(customstopwords, encoding='UTF-8').read().split(u'\n')

       customstopwords = stop_words

   result=''

   return_words = []

   # for w in words:

   #     if w not in stopwords:

   #         result += w.encode('utf-8')  # +"/"+str(w.flag)+" "  #去停用词

   words = pseg.lcut(content)

   for word, flag in words:

       # print word.encode('utf-8')

       tempword = word.encode('utf-8').strip(' ')

       if (word not in customstopwords and len(tempword)>0 and flag in [u'n',u'nr',u'ns',u'nt',u'nz',u'ng',u't',u'tg',u'f',u'v',u'vd',u'vn',u'vf',u'vx',u'vi',u'vl',u'vg', u'a',u'an',u'ag',u'al',u'm',u'mq',u'o',u'x']):

           # and flag[0] in [u'n', u'f', u'a', u'z']):

           # ["/x","/zg","/uj","/ul","/e","/d","/uz","/y"]): #去停用词和其他词性,比如非名词动词等

           result += tempword # +"/"+str(w.flag)+" "  #去停用词

           return_words.append(tempword)

   return result,return_words

def get_save_wikitext(wiki_filename,text_filename):

   output = open(text_filename, 'w')

   wiki = corpora.WikiCorpus(text_filename, lemmatize=False, dictionary={})

   for text in wiki.get_texts():

       # text = delNOTNeedWords(text,"../../stopwords.txt")[1]

       output.write(" ".join(text) + "\n")

       i = i + 1

       if (i % 10000 == 0):

           logging.info("Saved " + str(i) + " articles")

   output.close()

def load_save_word2vec_model(line_words, model_filename):

   # 模型参数

   feature_size = 500

   content_window = 5

   freq_min_count = 3

   # threads_num = 4

   negative = 3   #best采样使用hierarchical softmax方法(负采样,对常见词有利),不使用negative sampling方法(对罕见词有利)。

   iter = 20

   print("word2vec...")

   tic = time.time()

   if os.path.isfile(model_filename):

       model = models.Word2Vec.load(model_filename)

       print(model.vocab)

       print("Loaded word2vec model")

   else:

       bigram_transformer = models.Phrases(line_words)

       model = models.Word2Vec(bigram_transformer[line_words], size=feature_size, window=content_window, iter=iter, min_count=freq_min_count,negative=negative, workers=multiprocessing.cpu_count())

       toc = time.time()

       print("Word2vec completed! Elapsed time is %s." % (toc-tic))

       model.save(model_filename)

       # model.save_word2vec_format(save_model2, binary=False)

       print("Word2vec Saved!")

   return model

if __name__ == '__main__':

   limit = -1 #该属性决定取wiki文件text tag前多少条,-1为所有

   wiki_filename = '/home/wac/data/zhwiki-20160203-pages-articles-multistream.xml'

   wiki_text = './wiki_text.txt'

   wikimodel_filename = './word2vec_wiki.model'

   s_list = []

   # if you want get wiki text ,uncomment lines

   # get_save_wikitext(wiki_filename,wiki_text)

   # for i,text in enumerate(open(wiki_text, 'r')):

   #     s_list.append(delNOTNeedWords(text,"../../stopwords.txt")[1])

   #     print(i)

   #

   #     if i==limit: #取前limit条,-1为所有

   #         break

   #

   #计算模型

   model = load_save_word2vec_model(s_list, wikimodel_filename)

   #计算相似单词,命令行输入

   while 1:

       print("请输入想测试的单词: ", end='\b')

       t_word = sys.stdin.readline()

       if "quit" in t_word:

           break

       try:

           results = model.most_similar(t_word.decode('utf-8').strip('\n').strip('\r').strip(' ').split(' '), topn=30)

       except:

           continue

       for t_w, t_sim in results:

           print(t_w, " ", t_sim)

         

         





相关文章
|
10天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
67 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
3月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
67 2
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能(AI)之计算机视觉和自然语言训练文件
人工智能(AI)之计算机视觉和自然语言训练文件
85 0
|
5月前
|
自然语言处理 算法 数据可视化
NLP-基于bertopic工具的新闻文本分析与挖掘
这篇文章介绍了如何使用Bertopic工具进行新闻文本分析与挖掘,包括安装Bertopic库、加载和预处理数据集、建立并训练主题模型、评估模型性能、分类新闻标题、调优聚类结果的详细步骤和方法。
NLP-基于bertopic工具的新闻文本分析与挖掘
|
5月前
|
自然语言处理
【NLP】如何实现快速加载gensim word2vec的预训练的词向量模型
本文探讨了如何提高使用gensim库加载word2vec预训练词向量模型的效率,提出了三种解决方案:保存模型以便快速重新加载、仅保存和加载所需词向量、以及使用Embedding工具库代替word2vec原训练权重。
303 2
|
5月前
|
机器学习/深度学习 存储 自然语言处理
【NLP-新闻文本分类】3 Bert模型的对抗训练
详细介绍了使用BERT模型进行新闻文本分类的过程,包括数据集预处理、使用预处理数据训练BERT语料库、加载语料库和词典后用原始数据训练BERT模型,以及模型测试。
90 1
|
5月前
|
机器学习/深度学习 自然语言处理 数据可视化
自然语言处理 Paddle NLP - 词向量应用展示
自然语言处理 Paddle NLP - 词向量应用展示
60 0
|
6月前
|
SQL 人工智能 自然语言处理
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
156 0
|
7月前
|
机器学习/深度学习 自然语言处理 PyTorch
【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词
【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词
|
8月前
|
自然语言处理 算法
自然语言处理第3天:Word2Vec模型
自然语言处理第3天:Word2Vec模型

热门文章

最新文章

下一篇
开通oss服务