相关代码



一、任务

设计筛选条件,将某类专利(如人工智能)申请信息, 按 省份、年度、专利申请数 构造面板数据。如下图



二、专利数据集

数据集 | 3571万条专利申请数据集(1985-2022年)


2.1 概况

- 数据集名称:省份版知识产权局专利
- 时间跨度:1985.1-2022.5,专利申请总量3571万
- 数据来源:『国家知识产权局』
- 数据整理: 『公众号:大邓和他的Python』

3571万专利申请全量数据(1985.01 ~ 2022.5)数据,解压后整个文件夹大概 20 G。


2.2 获取数据


3571万条专利申请数据集(1985-2022年) 100元,需要的话, 加微信 372335839 ,备注【姓名-学校-专业】



三、实验代码

本实验代码文件目录结构

  |- 专利面板数据.ipynb
  |- Word2Vec
     |-1000w专利摘要文本.100.6.bin
     |-1000w专利摘要文本.100.6.bin.syn1neg.npy
     |-1000w专利摘要文本.100.6.bin.wv.vectors.npy
  |3571万专利申请全量数据1985-2022年
     |-广东省.csv.gz
     |-...
     |-西藏自治区.csv.gz
  |-AI_details.xlsx
  |-AI_panel.xlsx

3.1 人工智能相关词

使用之前 词向量(付费) | 使用3751w专利申请数据集按年份(按省份)训练词向量 来扩展 「大数据」相关关键词。

#2.0.0版cntext,未公开,需要私信372335839
import cntext as ct

#查看版本
print(ct.__version__)

w2v_m = ct.load_w2v('Word2Vec/1000w专利摘要文本.100.6.bin')
w2v_m

Run

2.0.0
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('3571万专利申请全量数据1985-2022年/内蒙古自治区.csv.gz', compression='gzip')
print(len(df))
df.head(1)


#含有的字段
df.columns

Run

Index(['专利公开号', '专利名称', '专利类型', '专利摘要', '申请人', '专利申请号', '申请日', '申请公布日',
       '授权公布号', '授权公布日', '申请地址', '主权项', '发明人', '分类号', '主分类号', '代理机构', '分案原申请号',
       '优先权', '国际申请', '国际公布', '代理人', '省份或国家代码', '法律状态', '专利领域', '专利学科',
       '多次公布'],
      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)

#内容太多, 选择需要的字段进行展示
selected_fields = ['专利名称', '专利摘要', '专利类型', '申请日', '专利学科', '专利领域']
#专利
ai_df = df[mask1 & mask2][selected_fields]
ai_df


筛选结果基本上都是人工智能相关专利技术。


3.4 专利类型分布

内蒙古自治区, 人工智能相关专利的类型分布

ai_df['专利类型'].value_counts()

Run

专利类型
发明公开    52
实用新型    18
外观设计     5
发明授权     4
Name: count, dtype: int64

3.5 年度申请量

计算内蒙古自治区,人工智能相关专利年度申请量。 根据申请日, 先生成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

2015 2
2016 3
2017 4
2018 7
2019 8
2020 28
2021 24
2022 3

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

{'年度': '2015', '实用新型': 0, '发明公开': 0, '外观设计': 2, '发明授权': 0, '省份': '内蒙古自治区'}
{'年度': '2016', '实用新型': 1, '发明公开': 0, '外观设计': 2, '发明授权': 0, '省份': '内蒙古自治区'}
{'年度': '2017', '实用新型': 3, '发明公开': 1, '外观设计': 0, '发明授权': 0, '省份': '内蒙古自治区'}
{'年度': '2018', '实用新型': 1, '发明公开': 5, '外观设计': 0, '发明授权': 1, '省份': '内蒙古自治区'}
{'年度': '2019', '实用新型': 4, '发明公开': 3, '外观设计': 0, '发明授权': 1, '省份': '内蒙古自治区'}
{'年度': '2020', '实用新型': 4, '发明公开': 22, '外观设计': 0, '发明授权': 2, '省份': '内蒙古自治区'}
{'年度': '2021', '实用新型': 5, '发明公开': 18, '外观设计': 1, '发明授权': 0, '省份': '内蒙古自治区'}
{'年度': '2022', '实用新型': 0, '发明公开': 3, '外观设计': 0, '发明授权': 0, '省份': '内蒙古自治区'}

3.7 路径列表

使用glob库查看专利申请数据集内的含 csv.gz 的所有文件路径

import glob

#剔除港、澳、台、海外
not_in = ['3571万专利申请全量数据1985-2022年/台湾省.csv.gz',
          '3571万专利申请全量数据1985-2022年/澳门特别行政区.csv.gz', 
          '3571万专利申请全量数据1985-2022年/香港特别行政区.csv.gz', 
          '3571万专利申请全量数据1985-2022年/其他国家.csv.gz']


files = glob.glob('3571万专利申请全量数据1985-2022年/*.csv.gz')
files = [f for f in files if f not in not_in]
files

Run

['3571万专利申请全量数据1985-2022年/内蒙古自治区.csv.gz',
 '3571万专利申请全量数据1985-2022年/吉林省.csv.gz',
 '3571万专利申请全量数据1985-2022年/安徽省.csv.gz',
 '3571万专利申请全量数据1985-2022年/江苏省.csv.gz',
 ......
 '3571万专利申请全量数据1985-2022年/海南省.csv.gz',
 '3571万专利申请全量数据1985-2022年/河北省.csv.gz',
 '3571万专利申请全量数据1985-2022年/黑龙江省.csv.gz',
 '3571万专利申请全量数据1985-2022年/宁夏回族自治区.csv.gz',
 '3571万专利申请全量数据1985-2022年/广西壮族自治区.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')
    
    mask1 = df['专利名称'].fillna('').str.contains(AI_rela_words)
    mask2 = df['专利摘要'].fillna('').str.contains(AI_rela_words)

    ai_df = df[mask1 & mask2]
    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.head(2)

Run

3571万专利申请全量数据1985-2022年/内蒙古自治区.csv.gzip
3571万专利申请全量数据1985-2022年/吉林省.csv.gzip
......
3571万专利申请全量数据1985-2022年/宁夏回族自治区.csv.gzip
3571万专利申请全量数据1985-2022年/广西壮族自治区.csv.gzip

记录数: 394
CPU times: user 12min 40s, sys: 1min 1s, total: 13min 41s
Wall time: 13min 42s


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


AI_rela_words = '人工智能|机器学习|AI|NLP|智能问答|智能问答|神经机器翻译|NLU|增量学习'

#剔除港、澳、台、海外
not_in = ['3571万专利申请全量数据1985-2022年/台湾省.csv.gz',
          '3571万专利申请全量数据1985-2022年/澳门特别行政区.csv.gz', 
          '3571万专利申请全量数据1985-2022年/香港特别行政区.csv.gz', 
          '3571万专利申请全量数据1985-2022年/其他国家.csv.gz']
files = glob.glob('3571万专利申请全量数据1985-2022年/*.csv.gz')
files = [f for f in files if f not in not_in]


AI_Relatives_Patents = []
for file in 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)
    ai_df = df[mask1 & mask2]
    
    #保存全国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)



五、欣赏下成品

ai_panel_df2 = pd.read_csv('AI_panel.csv')
ai_panel_df2


更多数据集,可点击前往 LIST | 可供社科(经管)领域使用的数据集汇总



广而告之