相关代码



一、任务

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



二、专利数据集

数据集 | 5112万条专利申请数据集(1985-2025年)


2.1 概况

- 数据集名称:中国专利申请数据集
- 时间跨度:1985.1-2025.1,专利申请总量3571万
- 数据来源:『国家知识产权局』
- 数据来源:『国家知识产权局』
- 数据体积:  解压后整个文件夹大概 90 G+


2.2 获取数据


5112万条专利申请数据集(1985-2025.1年)



三、实验代码

本实验代码文件目录结构

  |- 专利面板数据.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)