相关代码
一、任务
设计筛选条件,将某类专利(如人工智能)申请信息, 按 省份、年度、专利申请数 构造面板数据。如下图
二、专利数据集
数据集 | 5112万条专利申请数据集(1985-2025年)
2.1 概况
- 数据集名称:中国专利申请数据集
- 时间跨度:1985.1-2025.1,专利申请总量3571万
- 数据来源:『国家知识产权局』
- 数据来源:『国家知识产权局』
- 数据体积: 解压后整个文件夹大概 90 G+
2.2 获取数据
- 免费下载 专利面板数据.ipynb
- 免费下载 AI_panel.xlsx
- 免费下载 AI_details.csv
三、实验代码
本实验代码文件目录结构
|- 专利面板数据.ipynb
|- Word2Vec
|-1000w专利摘要文本.100.6.bin
|-1000w专利摘要文本.100.6.bin.syn1neg.npy
|-1000w专利摘要文本.100.6.bin.wv.vectors.npy
|5112万专利申请全量数据1985-2025年
|-广东省.csv.gz
|-...
|-西藏自治区.csv.gz
|-AI_details.xlsx
|-AI_panel.xlsx
3.1 人工智能相关词
使用之前 词向量(付费) | 使用1985年-2025年专利申请摘要训练Word2Vec模型 来扩展 「大数据」相关关键词。
#2.1.4版cntext,未公开,需要私信372335839
import cntext as ct
#查看版本
print(ct.__version__)
w2v_m = ct.load_w2v('Word2Vec/1000w专利摘要文本.100.6.bin')
w2v_m
Run
2.1.4
Loading word2vec model...
<gensim.models.word2vec.Word2Vec at 0x109a8c810>
#我能想到的AI技术就这四个词
w2v_m.wv.most_similar(['人工智能'], topn=30)
Run
[('AI', 0.8372030854225159),
('人工智能技术', 0.7714870572090149),
('AI智能', 0.74532151222229),
('智能决策', 0.7404459714889526),
('AI人工智能', 0.7198485732078552),
('云计算', 0.7136917114257812),
('人工智能学习', 0.7058480381965637),
('深度学习', 0.6903414130210876),
('交互式', 0.6859808564186096),
('智慧校园', 0.6856474876403809),
('信息技术', 0.6841551661491394),
('智慧养老', 0.682081937789917),
('智慧旅游', 0.6777652502059937),
('智慧医疗', 0.6757360100746155),
('智能机器人', 0.6742302179336548),
('智慧', 0.6734717488288879),
('人工智能语音', 0.6727728247642517),
('物联网', 0.66999351978302),
('机器学习', 0.6683002710342407),
('健康管理', 0.6656192541122437),
('人工智能AI', 0.6648072600364685),
('AI视觉', 0.6609936356544495),
('智慧社区', 0.6581154465675354),
('自主学习', 0.6569625735282898),
('图像识别', 0.6551436185836792),
('健康管理系统', 0.6537778377532959),
('数据分析系统', 0.6528143882751465),
('教学系统', 0.6516135334968567),
('图形化编程', 0.6513208150863647),
('计算机技术', 0.6512178182601929)]
w2v_m.wv.most_similar(['人工智能', '机器学习', 'AI', 'NLP', '智能机器人'], topn=30)
Run
[('人工智能技术', 0.8236023783683777),
('人工智能学习', 0.7996466159820557),
('自然语言理解', 0.7942413687705994),
('深度学习', 0.7931050658226013),
('智能决策', 0.7848177552223206),
('上下文感知', 0.7765907049179077),
('自然语言处理', 0.7757146954536438),
('智能问答', 0.7602421641349792),
('自主学习', 0.7582942247390747),
('问答系统', 0.7564904093742371),
('在线学习', 0.7510443329811096),
('人工智能算法', 0.7500166296958923),
('数据挖掘', 0.7495553493499756),
('AI算法', 0.7419456839561462),
('自我学习', 0.7414599061012268),
('AI模型', 0.7412964105606079),
('人工智能AI', 0.7401654720306396),
('知识推理', 0.7398316860198975),
('语音语义', 0.7393308877944946),
('行为识别', 0.7342970967292786),
('人工智能语音', 0.7332825660705566),
('多任务', 0.7270201444625854),
('神经机器翻译', 0.7220420837402344),
('边云协同', 0.7219405174255371),
('图形化编程', 0.7205625772476196),
('云计算', 0.7199273109436035),
('众包', 0.7197409272193909),
('AI智能', 0.7154985666275024),
('NLU', 0.7152286767959595),
('AI人工智能', 0.7139929533004761)]
通过运行多次查询相似词,不断浓缩,得到人工智能技术相关技术词(不一定全,只是演示)
AI_rela_words = '人工智能|机器学习|AI|NLP|智能问答|智能问答|神经机器翻译|NLU|增量学习'
3.2 读取专利数据
尝试读取一个文件 写代码先局部后整体,先小后大。 能在局部小文件做实验成功,就可以for循环推广到所有的文件。这里我们选择 内蒙古自治区.csv.gz
import pandas as pd
df = pd.read_csv('5112万专利申请全量数据1985-2025年/内蒙古自治区.csv.gz', compression='gzip')
print(len(df))
df.head(1)
#含有的字段
df.columns
Run
Index(['专利名称', '专利类型', '申请人', '申请人类型', '申请人地址', '申请人国家', '申请人省份', '申请人城市',
'申请人区县', '申请号', '申请日', '申请年份', '公开公告号', '公开公告日', '公开公告年份', '授权公告号',
'授权公告日', '授权公告年份', 'IPC分类号', 'IPC主分类号', '发明人', '摘要文本', '主权项内容', '当前权利人',
'当前专利权人地址', '专利权人类型', '统一社会信用代码', '引证次数', '被引证次数', '自引次数', '他引次数',
'被自引次数', '被他引次数', '家族引证次数', '家族被引证次数'],
dtype='object')
3.3 筛选专利
使用逻辑条件把 专利名称 、 摘要文本 、主权项内容 中含 人工智能 相关概念词的申请记录筛选出来。 注意, 筛选条件的严格程度根据自己需要调整,这里使用的最严格的条件,即 人工智能词同时出现在专利名称和专利摘要,才将该专利识别为人工智能专利。
AI_rela_words = '人工智能|机器学习|AI|NLP|智能问答|智能问答|神经机器翻译|NLU|增量学习'
mask1 = df['专利名称'].fillna('').str.contains(AI_rela_words)
mask2 = df['摘要文本'].fillna('').str.contains(AI_rela_words)
mask3 = df['主权项内容'].fillna('').str.contains(AI_rela_words)
#内容太多, 选择需要的字段进行展示
selected_fields = ['专利名称', '摘要文本', '主权项内容', '申请日', 'IPC分类号']
#专利
ai_df = df[mask1 & mask2 & mask3][selected_fields]
ai_df
筛选结果基本上都是人工智能相关专利技术。
3.4 年度申请量
计算内蒙古自治区,人工智能相关专利年度申请量。 根据申请日, 先生成year字段
ai_df['year'] = ai_df["申请日"].apply(lambda d:d[:4])
for year, ai_year_df in ai_df.groupby('year'):
print(year, len(ai_year_df))
Run
2014 2
2016 2
2017 13
2018 25
2019 38
2020 65
2021 83
2022 123
2023 4
2024 75
3.6 获取年度各种专利类型的数量
计算内蒙古自治区,人工智能领域各类型专利的年度申请量
for year, ai_year_df in ai_df.groupby('year'):
data = dict()
data['年度'] = year
data['实用新型'] = (ai_year_df['专利类型']=='实用新型').sum()
data['发明公开'] = (ai_year_df['专利类型']=='发明公开').sum()
data['外观设计'] = (ai_year_df['专利类型']=='外观设计').sum()
data['发明授权'] = (ai_year_df['专利类型']=='发明授权').sum()
data['省份'] = '内蒙古自治区'
print(data)
Run
{'年度': '2014', '实用新型': 0, '发明公开': 0, '外观设计': 0, '发明授权': 1, '省份': '内蒙古自治区'}
{'年度': '2016', '实用新型': 0, '发明公开': 0, '外观设计': 0, '发明授权': 1, '省份': '内蒙古自治区'}
{'年度': '2017', '实用新型': 1, '发明公开': 0, '外观设计': 0, '发明授权': 3, '省份': '内蒙古自治区'}
{'年度': '2018', '实用新型': 1, '发明公开': 0, '外观设计': 0, '发明授权': 6, '省份': '内蒙古自治区'}
{'年度': '2019', '实用新型': 5, '发明公开': 0, '外观设计': 0, '发明授权': 9, '省份': '内蒙古自治区'}
{'年度': '2020', '实用新型': 12, '发明公开': 0, '外观设计': 0, '发明授权': 14, '省份': '内蒙古自治区'}
{'年度': '2021', '实用新型': 7, '发明公开': 0, '外观设计': 0, '发明授权': 11, '省份': '内蒙古自治区'}
{'年度': '2022', '实用新型': 14, '发明公开': 0, '外观设计': 0, '发明授权': 14, '省份': '内蒙古自治区'}
{'年度': '2023', '实用新型': 0, '发明公开': 0, '外观设计': 0, '发明授权': 0, '省份': '内蒙古自治区'}
{'年度': '2024', '实用新型': 2, '发明公开': 0, '外观设计': 0, '发明授权': 1, '省份': '内蒙古自治区'}
3.7 路径列表
使用glob库查看专利申请数据集内的含 csv.gz 的所有文件路径
import glob
files = glob.glob('5112万专利申请全量数据1985-2025年/*.csv.gz')
files = [f for f in files if f not in not_in]
files
Run
['5112万专利申请全量数据1985-2025年/北京市.csv.gz',
'5112万专利申请全量数据1985-2025年/广西壮族自治区.csv.gz',
'5112万专利申请全量数据1985-2025年/河北省.csv.gz',
'5112万专利申请全量数据1985-2025年/海南省.csv.gz',
'5112万专利申请全量数据1985-2025年/天津市.csv.gz',
......
'5112万专利申请全量数据1985-2025年/新疆维吾尔自治区.csv.gz',
'5112万专利申请全量数据1985-2025年/辽宁省.csv.gz',
'5112万专利申请全量数据1985-2025年/河南省.csv.gz',
'5112万专利申请全量数据1985-2025年/宁夏回族自治区.csv.gz']
3.8 批量运算
现在对所有省市进行刚刚的操作, 筛选出的人工智能专利详细信息保存到 AI_details.csv , 同时汇总面板数据(年度、省份、专利数量), 得到 AI_panel.xlsx 。
%%time
AI_rela_words = '人工智能|机器学习|AI|NLP|智能问答|智能问答|神经机器翻译|NLU|增量学习'
AI_Relatives_Patents = []
for file in files:
print(file)
prov = file.split('/')[-1].replace('.csv.gz', '')
df = pd.read_csv(file,
compression='gzip',
usecols=['专利名称', '摘要文本', '主权项内容', '申请日', '专利类型']
)
mask1 = df['专利名称'].fillna('').str.contains(AI_rela_words)
mask2 = df['摘要文本'].fillna('').str.contains(AI_rela_words)
mask3 = df['主权项内容'].fillna('').str.contains(AI_rela_words)
ai_df = df[mask1 & mask2 & mask3]
ai_df['year'] = ai_df["申请日"].apply(lambda d:d[:4])
#保存全国AI专利详情信息
ai_df.to_csv('AI_details.csv', mode='a', index=False)
for year, ai_year_df in ai_df.groupby('year'):
data = dict()
data['年度'] = year
data['实用新型'] = (ai_year_df['专利类型']=='实用新型').sum()
data['发明公开'] = (ai_year_df['专利类型']=='发明公开').sum()
data['外观设计'] = (ai_year_df['专利类型']=='外观设计').sum()
data['发明授权'] = (ai_year_df['专利类型']=='发明授权').sum()
data['省份'] = prov
AI_Relatives_Patents.append(data)
ai_panel_df = pd.DataFrame(AI_Relatives_Patents)
ai_panel_df.to_excel('AI_panel.xlsx', index=False)
print('记录数:', len(ai_panel_df))
ai_panel_df
Run
5112万专利申请全量数据1985-2025年/北京市.csv.gz
5112万专利申请全量数据1985-2025年/广西壮族自治区.csv.gz
......
5112万专利申请全量数据1985-2025年/河南省.csv.gz
5112万专利申请全量数据1985-2025年/宁夏回族自治区.csv.gz
记录数: 523
CPU times: user 15min 38s, sys: 46.4 s, total: 16min 24s
Wall time: 16min 27s
3.9 剔除重复
AI_details.csv 会有一些重复内容,可以剔除重复内容,删除旧文件,导出新的不重复的文件。
import os
AI_detail_df = pd.read_csv('AI_details.csv')
AI_detail_df = AI_detail_df[AI_detail_df['专利公开号']!='专利公开号']
AI_detail_df.drop_duplicates(inplace=True)
os.remove("AI_details.csv")
AI_detail_df.to_excel("AI_details.xlsx", index=False)
四、汇总代码
本文全部代码汇总于此
import glob
import pandas as pd
import tqdm import tqdm
AI_rela_words = '人工智能|机器学习|AI|NLP|智能问答|智能问答|神经机器翻译|NLU|增量学习'
#剔除港、澳、台、海外
not_in = ['5112万专利申请全量数据1985-2025年/台湾省.csv.gz',
'5112万专利申请全量数据1985-2025年/澳门特别行政区.csv.gz',
'5112万专利申请全量数据1985-2025年/香港特别行政区.csv.gz',
'5112万专利申请全量数据1985-2025年/其他国家.csv.gz']
files = glob.glob('5112万专利申请全量数据1985-2025年/*.csv.gz')
AI_Relatives_Patents = []
for file in tqdm(files):
print(file)
prov = file.split('/')[-1].replace('.csv.gz', '')
df = pd.read_csv(file, compression='gzip')
#筛选出AI专利
mask1 = df['专利名称'].fillna('').str.contains(AI_rela_words)
mask2 = df['摘要文本'].fillna('').str.contains(AI_rela_words)
mask3 = df['主权项内容'].fillna('').str.contains(AI_rela_words)
ai_df = df[mask1 & mask2 & mask3]
#保存全国AI专利详情信息
ai_df.to_csv('AI_details.csv', mode='a', index=False)
ai_df['year'] = ai_df["申请日"].apply(lambda d:d[:4])
for year, ai_year_df in ai_df.groupby('year'):
data = dict()
data['年度'] = year
data['实用新型'] = (ai_year_df['专利类型']=='实用新型').sum()
data['发明公开'] = (ai_year_df['专利类型']=='发明公开').sum()
data['外观设计'] = (ai_year_df['专利类型']=='外观设计').sum()
data['发明授权'] = (ai_year_df['专利类型']=='发明授权').sum()
data['省份'] = prov
AI_Relatives_Patents.append(data)
china_ai_df = pd.DataFrame(AI_Relatives_Patents)
china_ai_df.to_excel('AI_panel.xlsx', index=False)
AI_detail_df = pd.read_csv('AI_details.csv')
AI_detail_df = AI_detail_df[AI_detail_df['专利公开号']!='专利公开号']
AI_detail_df.drop_duplicates(inplace=True)
os.remove("AI_details.csv")
AI_detail_df.to_excel("AI_details.xlsx", index=False)