word2vect训练

语料库

使用搜狗实验室12年的全网新闻数据。
这里写图片描述
选择相应的下载包,注册搜狗的下载用户就可以下载了。
这里写图片描述
这里写图片描述
注册后,搜狗会生成相应的用户名和密码供下载使用。
原始文件大概700M左右,解压以后大概1.5GB
这里写图片描述
将其解压后得到news_tensite_xml.dat文件

tar -zxvf news_tensite_xml.full.tar.gz
或
unzip news_tensite_xml.full.zip

处理语料库

解压后得到的文件是用gbk编码的,同时文件使用xml格式,包含大量对我们来说没有用的信息。

cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>" | sed 's\<content>\\' | sed 's\</content>\\' > news.txt 

将原始数据过滤后,得到中间的新闻文本,将其输出到news.txt 文件中。

分词

分词采用jieba分词工具

i=0
for line in f.readlines():
    i = i + 1
    sentences.append(jieba.cut(line.strip()))
    if(i%500 == 0):
        print('writing')
        for sentence in sentences:
            out.write(" ".join(sentence) + "\n")
            out.flush()
        print('writing ending!')
        sentences = []

f = open(filepath2,'w')
for sentence in sentences:
f.write(" ".join(sentence) + "\n")

这样整个文件就每行一条新闻,每条新闻都按空格分隔。整个分词的过程可能比较慢。

加载数据,word2vec训练

word2vec的训练使用gensim,使用默认的参数进行训练。


class MySentences(object):
    def __init__(self, filename):
        self.filename = filename

    def __iter__(self):
        for line in open(self.filename):
            yield line.split()

sentences = MySentences(filename)
model = gensim.models.Word2Vec(sentences)

# save model
model.save(filepath)

因为训练的数据比较多,所以不建议使用一次加载所有数据的方法,使用python中自带的产生器yield,以挤牙膏的方式,减少内存的占用率。整个训练过程大概需要几十分钟(因个人电脑配置而定)

测试

import gensim, logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

model = gensim.models.Word2Vec.load(filepath)

print(model.most_similar('电脑'))

这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import sys import re import jieba import codecs import gensim import numpy as np import pandas as pd def segment(doc: str): stop_words = pd.read_csv('data/stopwords.txt', index_col=False, quoting=3, names=['stopword'], sep='\n', encoding='utf-8') stop_words = list(stop_words.stopword) reg_html = re.compile(r'<[^>]+>', re.S) # 去掉html标签数字等 doc = reg_html.sub('', doc) doc = re.sub('[0-9]', '', doc) doc = re.sub('\s', '', doc) word_list = list(jieba.cut(doc)) out_str = '' for word in word_list: if word not in stop_words: out_str += word out_str += ' ' segments = out_str.split(sep=' ') return segments def doc2vec(file_name, model, doc_id): start_alpha = 0.01 infer_epoch = 1000 doc = segment(codecs.open(file_name, 'r', 'utf-8').read()) return model.infer_vector(doc, alpha=start_alpha, steps=infer_epoch) # 计算两个向量余弦值 def similarity(a_vect, b_vect): dot_val = 0.0 a_norm = 0.0 b_norm = 0.0 cos = None for a, b in zip(a_vect, b_vect): dot_val += a * b a_norm += a ** 2 b_norm += b ** 2 if a_norm == 0.0 or b_norm == 0.0: cos = -1 else: cos = dot_val / ((a_norm * b_norm) ** 0.5) return cos def test_model(file1, file2): print('导入模型') model_path = 'tmp/zhwk_news.doc2vec' model = gensim.models.Doc2Vec.load(model_path) vect1 = doc2vec(file1, model, doc_id=0) # 转成句子向量 vect2 = doc2vec(file2, model, doc_id=1) print(vect1.nbytes) # 查看向量大小 print(vect2.nbytes) cos = similarity(vect1, vect2) print('相似度:%0.2f%%' % (cos * 100)) if __name__ == '__main__': file1 = 'data/corpus_test/t1.txt' file2 = 'data/corpus_test/t2.txt' test_model(file1, file2) 报错AttributeError: 'Doc2Vec' object has no attribute 'dv'怎么解决
06-13

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值