embedding

搜狐新闻数据(SogouCS)

介绍:

来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL和正文信息

格式说明:

数据格式为



页面URL

页面ID

页面标题

页面内容

注意:content字段去除了HTML标签,保存的是新闻正文文本

完整版(648MB):tar.gz格式zip格式

1、构建中文语料库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 搜狐新闻 2.1G
tar -zxvf news_sohusite_xml.full.tar.gz
cat news_sohusite_xml.dat | iconv -f gb18030 -t utf-8 | grep "<content>" > news_sohusite.txt
sed -i 's/<content>//g' news_sohusite.txt
sed -i 's/<\/content>//g' news_sohusite.txt
python -m jieba -d ' ' news_sohusite.txt > news_sohusite_cutword.txt


# 全网新闻 1.8G
tar -zxvf news_tensites_xml.full.tar.gz
cat news_tensites_xml.full.tar.gz | iconv -f gb18030 -t utf-8 | grep "<content>" > news_tensite.txt
sed -i 's/<content>//g' news_tensite.txt
sed -i 's/<\/content>//g' news_tensite.txt
python -m jieba -d ' ' news_tensite.txt > news_tensite_cutword.txt

第一条命令解压之后会生成news_sohusite_xml.dat文件

2、利用gensim库进行训练

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import logging
from gensim.models import word2vec
import multiprocessing

# Loading corpus...
if __name__ == '__main__':
input_file = "news_sohu_text.txt"
vector_file = "news_sohu_embedding"
# 保存字典文件
vocab_file = "vocabulary_file"
sentences = word2vec.Text8Corpus(input_file)

'''
Training embedding...
embedding_dim : 100
window_size :5
minimum_count of word :5
epoch of model(iter):10
'''
# 记录各种优先级的东西; 激活日志记录
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s', level=logging.INFO)
# sg=0 使用cbow训练, sg=1对低频词较为敏感,默认是sg=0
model = word2vec.Word2Vec(sentences, size=100, window=5, min_count=6, iter=10, workers=multiprocessing.cpu_count())
# Saving word_embedding
model.wv.save_word2vec_format(vector_file, fvocab=vocab_file, binary=False)

​ input_file是输入文件,如果是训练词向量,必须是分词好的文件,词与词之间空格隔开。如果训练的是字向量,字与字之间同样用空格隔开。一个句子是一个列表,所有的句子是二维列表。

3、加载训练好的embedding并测试

1
2
3
4
5
6
7
8
9
# 加载模型,embedding_file是训练好的向量文件
model = gensim.models.KeyedVectors.load_word2vec_format(embedding_file, binary=False)
temp1 = model.most_similar('我') # 测试相关词
temp2 = model.most_similar('好') # 测试相关词
t = model.similarity("他", "她") # 测试相似度

print(temp1)
print(temp2)
print(t)

我在搜狐新闻训练的向量测试的结果:

[('咱', 0.8646953105926514), ('他', 0.857693076133728), ('你', 0.7627511024475098), ('她', 0.7525184750556946), ('俺', 0.7336732149124146), ('它', 0.7071460485458374), ('牠', 0.46839216351509094), ('谁', 0.4390422999858856), ('您', 0.40126579999923706), ('尤', 0.3958999514579773)]

[('懂', 0.4896905720233917), ('棒', 0.4554690718650818), ('是', 0.4444722533226013), ('佳', 0.44040754437446594), ('让', 0.43987756967544556), ('快', 0.4291210174560547), ('朋', 0.42199385166168213), ('错', 0.4218539297580719), ('多', 0.42170557379722595), ('乖',0.4164968729019165)]`` 0.813737169426`

4、训练注意

Word2vec 有多个影响训练速度和质量的参数。

其中之一是用来修剪内部字典树的。在一个数以亿计的预料中出现一到两次的单词非常有可能是噪音或不需要被关注的。另外,也没有足够的数据对他们进行有意义的训练。因此,最好的办法就是直接将他们忽略掉。
model = Word2Vec(sentences, min_count=10) # default value is 5

  1. 对于设定 min_count 的值,合理的范围是0 - 100,可以根据数据集的规模进行调整。
  2. 另一个参数是神经网络 NN 层单元数,它也对应了训练算法的自由程度。

    model = Word2Vec(sentences, size=200) # default value is 100
    更大的 size 值需要更多的训练数据,但也同时可以得到更准确的模型。合理的取值范围是几十到几百。

3.最后一个主要参数是训练并行粒度,用来加速训练。
model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelization
该参数只有在机器已安装 Cython 情况下才会起到作用。如没有 Cython,则只能单核运行。

5、评估

Word2vec 训练是一个非监督任务,很难客观地评估结果。评估要依赖于后续的实际应用场景。Google 公布了一个包含 20,000 语法语义的测试样例,形式为 “A is to B as C is to D”。

需要注意的是,如在此测试样例上展示良好性能并不意味着在其它应用场景依然有效,反之亦然

参考:

1.https://www.cnblogs.com/jkmiao/p/7007763.html

-------------本文结束感谢您的阅读-------------