5112万条专利申请数据集(1985-2025年) 中随机抽取了30%的 「专利摘要」,构成6.14G的训练语料(千万级别), 耗时6小时,训练得到word2vec模型。
需要注意, 100%全部语料有30+G, 训练时间非常长。
没办法,我不会优化代码性能,所以只能抽取 30% 的文本数据来训练word2vec ,语料体积大概10G。
本文需要用到新cntext,因为bug较多, 直接上传到PyPi,将导致之前制作的课程和公众号推文相关内容全部重新一遍。
一、语料构建
随机抽取20%的记录,构成千万专利文本摘要训练语料。
为了防止电脑内存爆炸, 对任意单个大csv文件,分批次读取,每次读10w行。最终将专利摘要文本保存到txt文件中,编码方式为utf-8。
如果想开发一些词典,可以跳过此部分内容,并不影响代码运行。
# 将代码放在csv数据文件夹内
import os
import pandas as pd
import re
with open('专利摘要.txt', 'w', encoding='utf-8') as corpus_file:
# 获得当前文件夹内所有的csv文件路径
chunk_dfs = pd.read_csv('中国专利数据库.csv.gz',
usecols = ['专利名称', '摘要文本'],
chunksize=100000)
for chunk_df in chunk_dfs:
# 剔除专利摘要为空的记录
sample_df = chunk_df.sample(frac=0.3)
raw_text = '\n'.join(sample_df['摘要文本'].fillna('))
corpus_file.write(raw_text)
最终得到的 专利摘要.txt 文件有 10G
二、训练word2vec
2.1 安装
将 cntext-2.1.6-py3-none-any.whl 放置于桌面,打开 cmd (苹果电脑打开terminal), 输入cd desktop
cd desktop
之后在 cmd (苹果电脑打开terminal) 中使用 pip3 安装
pip3 install cntext-2.1.6-py3-none-any.whl
文末有 cntext-2.1.6-py3-none-any.whl 获取方式
2.2 训练 Word2Vec
# cntext为2.1.6
import cntext as ct
w2v_model = ct.Word2Vec(corpus_file='专利摘要.txt',
lang='chinese',
vector_size=200, # 词向量维度
window_size=15,# 窗口大小
chunksize=10000) # 每次读取10000行
Run
Mac(Linux) System, Enable Parallel Processing
Cache output/专利摘要_cache.txt Not Found or Empty, Preprocessing Corpus
Reading Preprocessed Corpus from output/专利摘要_cache.txt
Start Training Word2Vec
Word2Vec Training Cost 8816 s.
Output Saved To: output/专利摘要-Word2Vec.200.15.bin
整理训练过程 2.5 小时, 训练结束后得到 output 文件夹, 里面有
- output/专利摘要-Word2Vec.200.15.bin 模型文件
- 专利摘要_cache.txt 训练缓存文件
2.3 评估模型
使用近义法和类比法, 判断模型的表现。详情可查看文档
ct.evaluate_similarity(w2v_model)
ct.evaluate_analogy(w2v_model)
Run
近义测试: similarity.txt
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/cntext/model/evaluate_data/similarity.txt
评估结果:
+----------+------------+----------------------------+
| 发现词语 | 未发现词语 | Spearman's Rank Coeficient |
+----------+------------+----------------------------+
| 427 | 110 | 0.46 |
+----------+------------+----------------------------+
类比测试: analogy.txt
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/cntext/model/evaluate_data/analogy.txt
Processing Analogy Test: 100%|██████████████| 1198/1198 [00:11<00:00, 99.91it/s]
评估结果:
+--------------------+----------+------------+------------+----------+
| Category | 发现词语 | 未发现词语 | 准确率 (%) | 平均排名 |
+--------------------+----------+------------+------------+----------+
| CapitalOfCountries | 238 | 439 | 3.78 | 5.67 |
| CityInProvince | 175 | 0 | 25.14 | 4.48 |
| FamilyRelationship | 156 | 116 | 33.33 | 2.29 |
| SocialScience | 8 | 62 | 37.50 | 2.33 |
+--------------------+----------+------------+------------+----------+
近义测试: Spearman’s Rank Coeficient系数取值[-1, 1], 取值越大, 说明模型表现越好。
类比测试:
- CapitalOfCountries 专利语料在此项表现很差, 应该是语料中常见国家首度的提及较少。
- CityInProvince 专利语料在此项好于CapitalOfCountries, 毕竟在中国大地进行科创。
- FamilyRelationship 专利语料中没想到在此项准确率中显著大于0, 我原本以为准确率为0,毕竟专利摘要中出现家人管理不太技术。没想到没想到啊。 发明可能类似于电影非诚勿扰里解决人类问题的例子,发明很雷人。
- SocialScience 专利语料在此项表现一般, 应该是语料中常见的社会科学词语提及较少。
整体而言,在四个维度准确率较低。 但是需要说明, 这四个维度是大邓自己收集的,评判模型类比表现维度有很多, 有可能专利摘要在别的类比维度上表现会很好。
三、使用词向量
3.1 录入模型
import cntext as ct
w2v = ct.load_w2v('output/专利摘要-Word2Vec.200.15.bin')
w2v
Run
Loading 专利摘要-Word2Vec.200.15.bin...
<gensim.models.keyedvectors.KeyedVectors at 0x32b079340>
3.2 KeyedVectors的操作方法(或属性)
方法 | 描述 |
---|---|
KeyedVectors.index_to_key | 获取词汇表中的所有单词。 |
KeyedVectors.key_to_index | 获取单词到索引的映射。 |
KeyedVectors.vector_size | 获取GloVe模型中任意词向量的维度。 |
KeyedVectors.get_vector(word) | 获取给定单词的词向量。 |
KeyedVectors.most_similar(words, topn=10) | 获取某类词(list)最相似的10个近义词。 |
KeyedVectors.similar_by_word(word, topn=10) | 获取某词语最相似的10个近义词。 |
KeyedVectors.similar_by_vector(vector, topn=10) | 获取词向量最相似的10个近义词。 |
3.3 词汇量&维度数
查看模型中的词汇量
print(f'词汇量: {len(w2v)}')
print(f'维度数: {w2v.vector_size}')
Run
词汇量: 1059801
维度数: 200
3.4 查看词向量
查看任意词的词向量,例如“”人工智能””
# 查看 ”人工智能” 的词向量
w2v['人工智能']
Run
array([-1.1817173 , -2.1371903 , -3.0181015 , 1.7000161 , -3.081852 ,
3.554449 , -0.22385244, 3.6647737 , -3.7086377 , -1.4868759 ,
-0.7706527 , 5.9335155 , 2.8328223 , -1.7995875 , -6.051175 ,
-0.91756725, -4.15509 , -1.6975762 , -4.5753274 , -3.022245 ,
......
-2.0807118 , -3.4522808 , 4.29429 , -1.712142 , -1.6512033 ,
2.625037 , -3.4015207 , 1.3526493 , -0.7858534 , -1.6782432 ,
-3.1669524 , -2.6371615 , -1.5394825 , 3.101744 , 0.44502366,
-1.4104489 , -0.01298253, -4.217453 , -0.92512876, 0.10754411],
dtype=float32)
3.5 最相似词
与’创新', ‘颠覆’最相似的20个词
# 词语列表中可传入任意多个词,
# 大邓词穷,只想到这两个相似的种子词
w2v.most_similar(['创新', '颠覆'], topn=20)
Run
[('革新', 0.7983665466308594),
('改革', 0.7454208731651306),
('变革', 0.7136300206184387),
('全新', 0.707391619682312),
('彻底改变', 0.7064372301101685),
('创造性', 0.6960274577140808),
('颠覆性', 0.6874485611915588),
('有别于', 0.6775000095367432),
('加以改进', 0.6736693978309631),
('摒弃', 0.6716011762619019),
('独创', 0.6609643697738647),
('颠覆传统', 0.6604534983634949),
('开创', 0.6531570553779602),
('核心技术', 0.6419240236282349),
('彻底颠覆', 0.6397384405136108),
('技术创新', 0.6390863060951233),
('突破性', 0.6368305087089539),
('大胆', 0.6357517242431641),
('技术革新', 0.6347700357437134),
('沿用', 0.6328355669975281)]
刚刚的运行,体现模型很好的学习到了专利摘要中的语义关系。
如果我想开发三个词典,分别是 创新、成本、质量 ,想直接将结果保存到txt中,可以运行如下代码
seeds = {'创新概念': ['创新', '颠覆'],
'成本概念': ['成本', ''],
'质量概念': ['质量']}
ct.expand_dictionary(wv=w2v, # word2vec词向量
seeddict=seeds, # 种子词字典
topn=20) # 保留20个最相似的词
Run
Finish! 创新概念 candidates saved to output/创新概念.txt
Finish! 成本概念 candidates saved to output/成本概念.txt
Finish! 质量概念 candidates saved to output/质量概念.txt
四、获取资源
- 免费 专利摘要-Word2Vec.200.15.bin 链接: https://pan.baidu.com/s/1LKebAWL5fzjUVo_MR7dVug?pwd=a56c 提取码: a56c
- 100元 cntext-2.1.6-py3-none-any.whl 如有需要,加微信 372335839, 备注「姓名-学校-专业」