基于wiki的中文语料进行word2vec模型训练

最近看了一篇NDSS会议上的一篇论文,有关web安全方向和nlp方向的,论文题目为《Game of Missuggestions: Semantic Analysis of Search-Autocomplete Manipulations》。正好自己也想学学nlp。为将来毕业做准备。。。

也算一个小白。。看到论文使用了词向量word2vec算法,便去研究了一下算法原理。

看了很多中英文博客,以及别人推荐的一篇很好的论文《word2vec Parameter Learning Explained》。

word2vec网上资料一大堆,,就不详细赘述了。

之后看完原理就小小实战了一下。python 有一个库gensim 可以直接调用进行训练模型。

选取了wiki的中文语料库进行训练。  

数据下载地址为 : https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2

之后便需要进行数据预处理了。使用gensim.Wikicorpus()函数可以处理上述数据。之后i使用get_texts函数可以将语料库中的一篇文章转为text文本格式的一行方便处理。具体使用方法可以参考官方文档。

import logging
from gensim.corpora import WikiCorpus


def main():
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    logging.info("------------ the program is running -------------")
    path_to_wiki_dump = "C:/nlp/gensim_demo/demo_data/zhwiki-latest-pages-articles.xml.bz2"
    wiki_corpus = WikiCorpus(path_to_wiki_dump, dictionary={})
    num = 0
    with open('wiki_text.txt', 'w', encoding='utf-8') as output:
        for text in wiki_corpus.get_texts():  # get_texts() 将 wiki的一篇文章转为textd的一行
            output.write(' '.join(text) + '\n')
            num += 1
            if num % 10000 == 0:
                logging.info("已处理 %d 文章" % num)


if __name__ == '__main__':
    main()

将数据转为text的时候,发现是繁体字居多,这个时候可以使用opencc 工具来进行转为简体字。

转为简体字后需要进行分词处理更方便word2vec来训练模型。分词采用了jieba分词。

import jieba
import logging


def main():
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    stopword_set = set()
    output = open('wiki_seg.txt', 'w', encoding='utf-8')
    with open('wiki.zh.jian.txt', 'r', encoding='utf-8') as content:
        for texts_num, line in enumerate(content):  # enumerate 给 line前加序号
            line = line.strip('\n')
            words = jieba.cut(line, cut_all=False)
            for word in words:
                if word not in stopword_set:
                    output.write(word + ' ')
            output.write('\n')
            if (texts_num + 1) % 10000 == 0:
                logging.info("已完成前 %d 行的断词" % (texts_num + 1))
    output.close()


if __name__ == '__main__':
    main()

分词结束后,就可以开始进行训练模型了。

from gensim.models import word2vec
import logging


def main():
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    sentences = word2vec.LineSentence("wiki_seg.txt")
    model = word2vec.Word2Vec(sentences, size=250, min_count=5)  # size 用来设置神经网络的层数
    model.save("chinese_wiki_word2vec.model")


if __name__ == "__main__":
    main()

训练好模型后,将其保存。

加载模型 之后可以看到下图的训练结果。

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Python中实现基于中文语料word2vec训练模型中保留非中文字符,可以采用以下两种方式: 1. 使用jieba分词工具,将文本中的中英文混合的词语分开,并将非中文字符作为一个独立的词汇来处理。示例代码如下: ```python import jieba # 加载停用词表 stopwords = [] with open('stopwords.txt') as f: for line in f: stopwords.append(line.strip()) # 分词,并过滤停用词和非中文字符 def tokenize(text): words = jieba.cut(text) words = [word for word in words if word not in stopwords and '\u4e00' <= word <= '\u9fa5'] return words # 读入文本并进行分词 sentences = [] with open('corpus.txt') as f: for line in f: line = line.strip() words = tokenize(line) sentences.append(words) # 训练模型 from gensim.models import Word2Vec model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4) ``` 2. 使用正则表达式,将非中文字符作为一个独立的词汇来处理。示例代码如下: ```python import re import jieba # 加载停用词表 stopwords = [] with open('stopwords.txt') as f: for line in f: stopwords.append(line.strip()) # 分词,并过滤停用词和非中文字符 def tokenize(text): text = re.sub(r'[^\u4e00-\u9fa5]+', ' ', text) words = jieba.cut(text) words = [word for word in words if word not in stopwords] return words # 读入文本并进行分词 sentences = [] with open('corpus.txt') as f: for line in f: line = line.strip() words = tokenize(line) sentences.append(words) # 训练模型 from gensim.models import Word2Vec model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4) ``` 其中,`corpus.txt`是待训练中文语料文件,`stopwords.txt`是停用词表文件,可以自行准备或从网络上下载。在训练过程中,可以根据需要调整`size`、`window`、`min_count`等参数,以便得到更好的词向量表示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值