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, 备注「姓名-学校-专业」