『词向量』用Word2Vec训练中文词向量(二)—— 采用维基百科语料库

本文是在『词向量』用Word2Vec训练中文词向量(一)—— 采用搜狗新闻数据集 的基础上,将两个语料库合并,进而训练出较好的词向量模型。

参考:基于word2vec使用中文wiki语料库训练词向量
小项目(Gensim库)–维基百科中文数据处理

数据集下载

点此下载:wiki 语料库 选择最新的。

下载下的文件为 zhwiki-latest-pages-articles.xml.bz2,大小为1.75GB(下载速度特慢)。
在这里插入图片描述

数据集处理

(一)文本提取

有两种方法可以从压缩文件中提取出文本:

  • 使用 gensim.corporaWikiCorpus 来直接对维基语料库进行处理。保存到 wikiCorpus/wikiCorpus.txt
from gensim.corpora import WikiCorpus

if __name__ == '__main__':

    print('主程序开始...')

    input_file_name = 'zhwiki-latest-pages-articles.xml.bz2'
    output_file_name = 'wikiCorpus/wikiCorpus.txt'
    print('开始读入wiki数据...')
    input_file = WikiCorpus(input_file_name, lemmatize=False, dictionary={})
    print('wiki数据读入完成!')

    print('处理程序开始...')
    count = 0
    with open(output_file_name, 'wb') as output_file:
        for text in input_file.get_texts():
            output_file.write(' '.join(text).encode("utf-8"))
            output_file.write('\n'.encode("utf-8"))
            count = count + 1
            if count % 10000 == 0:
                print('目前已处理%d条数据' % count)
    print('处理程序结束!')

    output_file.close()
    print('主程序结束!')

  • 下载 Wikipedia Extractor 来提取文本。
    在这里插入图片描述
    数据集处理完成,一共 35w+ 条数据,效果如下所示。我们发现,已经去除了标点,简直不要太赞!!!
    在这里插入图片描述

(二)化繁为简

下载 opencc ,进行繁简转换。

wikiCorpus.txt 复制到该文件夹中,用指示符 cd 到该文件夹,输入opencc -i wikiCorpus.txt -o wikiCorpusSim.txt -c t2s.json
在这里插入图片描述
即可完成转化,将转化后的 wikiCorpusSim.txt 保存到 python project,效果如图所示:
在这里插入图片描述

(三)文档分词

如果之前做过搜狗数据集的话,这一步应该很熟悉了。

import jieba

filePath = 'wikiCorpus/wikiCorpusSim.txt'  # 简化后文本
fileSegWordDonePath = 'wikiCorpus/wikiCorpusSegDone.txt'  # 分词处理后文本

# 将每一行文本依次存放到一个列表
fileTrainRead = []
with open(filePath, encoding='utf-8') as fileTrainRaw:
    for line in fileTrainRaw:
        fileTrainRead.append(line)

# 用jieba进行分词
fileTrainSeg = []
file_userDict = 'dict.txt'  # 自定义的词典
jieba.load_userdict(file_userDict)
for i in range(len(fileTrainRead)):
    fileTrainSeg.append([' '.join(jieba.cut(fileTrainRead[i], cut_all=False))])
    if i % 100 == 0:  # 每处理100个就打印一次
        print(i)

# 处理后写入文件
with open(fileSegWordDonePath, 'wb') as fW:
    for i in range(len(fileTrainSeg)):
        fW.write(fileTrainSeg[i][0].encode('utf-8'))
        fW.write('\n'.encode("utf-8"))
 

在这里插入图片描述

(四)合并数据集

将之前处理好的搜狗数据集与维基合并,生成炒鸡无敌中文语料库。


filePath1 = 'wikiCorpus/wikiCorpusSegDone.txt'  # wiki分词后语料库
filePath2 = 'sougouCorpus/sougouCorpusSegDone.txt'  # 搜狗语料库
filePath3 = 'corpusFinal.txt'  # 最终语料库


fileFinal = []
countS = 0  # sougou计数
countW = 0  # wiki计数

# 打开搜狗语料库
with open(filePath2, encoding='utf-8') as ff1:
    print("---成功导入搜狗语料库---")
    for line in ff1:
        fileFinal.append(line)
        countS = countS + 1
        if countS % 10000 == 0:
            print("---------已导入%d篇搜狗文章---------" % countS)

# 打开维基语料库
with open(filePath1, encoding='utf-8') as ff2:
    print("---成功导入wiki语料库---")
    for line in ff2:
        fileFinal.append(line)
        countW = countW + 1
        if countW % 10000 == 0:
            print("---------已导入%d篇维基文章---------" % countW)

# 打开最终文档,逐行写入
with open(filePath3, 'wb') as ff:
    for i in range(len(fileFinal)):
        ff.write(fileFinal[i].encode('utf-8'))
        if i % 10000 == 0:
            print("---------已合并%d篇文章---------" % i)

print("---------一共读入%d行---------" % len(fileFinal))
print("---------完成合并---------")

一共有 212w+ 行数据(其中维基71w 行 + 搜狗 141w 行)
在这里插入图片描述
大小为 3.35GB
在这里插入图片描述

训练模型

还是用的老代码

import logging
import sys
import gensim.models as word2vec
from gensim.models.word2vec import LineSentence, logger
# import smart_open


def train_word2vec(dataset_path, out_vector):
    # 设置输出日志
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))
    # 把语料变成句子集合
    sentences = LineSentence(dataset_path)
    # sentences = LineSentence(smart_open.open(dataset_path, encoding='utf-8'))  # 或者用smart_open打开
    # 训练word2vec模型(size为向量维度,window为词向量上下文最大距离,min_count需要计算词向量的最小词频)
    model = word2vec.Word2Vec(sentences, size=128, sg=1, window=6, min_count=5, workers=4, iter=6)
    # (iter随机梯度下降法中迭代的最大次数,sg为1是Skip-Gram模型)
    # 保存word2vec模型
    model.save("word2vec.model")
    model.wv.save_word2vec_format(out_vector, binary=False)


# 加载模型
def load_word2vec_model(w2v_path):
    model = word2vec.Word2Vec.load(w2v_path)
    return model


# 计算词语最相似的词
def calculate_most_similar(self, word):
    similar_words = self.wv.most_similar(word)
    print(word)
    for term in similar_words:
        print(term[0], term[1])


# 计算两个词相似度
def calculate_words_similar(self, word1, word2):
    print(self.wv.similarity(word1, word2))


# 找出不合群的词
def find_word_dismatch(self, list):
    print(self.wv.doesnt_match(list))


if __name__ == '__main__':
    dataset_path = 'corpusFinal.txt'
    out_vector = 'corpusFinal.vector'
    train_word2vec(dataset_path, out_vector)  # 训练模型

    # model = load_word2vec_model("word2vec.model")  # 加载模型

    # calculate_most_similar(model, "病毒")  # 找相近词

    # calculate_words_similar(model, "法律", "制度")  # 两个词相似度

    # print(model.wv.__getitem__('男人'))  # 词向量

    # list = ["早饭", "吃饭", "恰饭", "嘻哈"]

    # find_word_dismatch(model, list)



与“病毒”相关的词:
在这里插入图片描述

写在最后

如果时间来不及训练模型,或者是出现了错误,可以加我的Q:2206300581(一杯奶茶钱),我会提供分词后的结果【corpusSegDone.txt】以及训练好的模型【word2vec.model】。

参考文章

基于word2vec使用中文wiki语料库训练词向量
小项目(Gensim库)–维基百科中文数据处理

  • 17
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
训练word2vec模型需要准备一个文本语料库,可以是任何文本数据,比如文章、新闻、小说、诗歌等。下面是一个简单的步骤: 1. 准备数据:将文本数据转换成一行一行的句子,并将每个句子分成单词或者词组。需要对文本进行预处理,例如去除标点符号、停用词等。 2. 构建词表:将每个单词或者词组映射到唯一的整数编号上,这个编号称为词表中的索引。 3. 训练模型:使用训练数据来训练word2vec模型,模型的核心是利用上下文窗口来学习单词的向量表示。具体来说,对于每个单词,我们会选取它周围一定范围内的单词作为上下文,然后利用这些上下文来预测当前单词。这个过程可以使用神经网络来实现,其中输入是上下文单词的向量表示,输出是当前单词的向量表示。 4. 获得词向量训练word2vec模型后,我们可以使用模型来获得每个单词的向量表示。这些向量可以用于后续的自然语言处理任务,例如文本分类、情感分析等。 以下是一个示例代码: ```python from gensim.models import Word2Vec # 准备数据 sentences = [['this', 'is', 'the', 'first', 'sentence', 'for', 'word2vec'], ['this', 'is', 'the', 'second', 'sentence'], ['yet', 'another', 'sentence'], ['one', 'more', 'sentence'], ['and', 'the', 'final', 'sentence']] # 构建模型 model = Word2Vec(sentences, size=100, window=5, min_count=1, workers=4) # 获取词向量 vector = model.wv['sentence'] ``` 其中,`sentences`是一个嵌套列表,每个子列表代表一个句子,`size`是指定词向量的维度,`window`是指定上下文窗口的大小,`min_count`是指定词频的阈值,`workers`是指定训练时的并行数。训练好的模型可以通过`model.wv`来获取词向量,例如`model.wv['sentence']`就可以获取单词`sentence`的向量表示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值