名师讲堂|专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(一)

在论文「数字产业集群政策与关键核心技术突破式创新」中,作者提出了一种衡量专利关键数字技术突破创新性的指标:

虽然论文中的模型部分使用的是地区层面的突破创新性的指标,不过论文中似乎没有提及如何从专利层面到地区层面进行汇总。所以我们今天仅仅分享专利层面的计算方法。

该指标的计算包含专利的前向相似度和后向相似度,参考的是 Kelly et al.(2021)中的方法:

其中前向相似度的计算是指和之后年份申请的专利进行计算;后向相似度的计算是指和和之前年份申请的专利进行计算。

前向相似度是 forward similarity,后向相似度是 backward similarity。感觉翻译成前向、后向非常容易让人混淆,可能翻译成 前瞻相似度 和 回溯相似度。然后我又问了下 deepseek:

非常神奇。

由于内容较多,本课程会分三次讲解:

  1. 专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(一):计算每个专利的关键数字技术类 TF-IDF 指标;
  2. 专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(二):基于 Mata 程序的专利间前瞻、回溯相似度计算;
  3. 专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(三):使用并行技术提升计算速度。

TF-IDF

在处理数据之前,我们先介绍下 TF-IDF 指标。

在之前的课程中也有讲解过这个指标:

R 语言文本分析:https://rstata.duanshu.com/#/brief/course/bf37cf50eef04d38b43541cc52114c96

名师讲堂|Stata 中文文本分析:https://rstata.duanshu.com/#/brief/course/b6a9efd94e5a48c2bba52dc9fdfd4291

TF-IDF 的主要思想是:如果某个词或短语(term)在一篇文章中出现的频率高(tf 高),并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。例如一篇文档的总术语数是 100 ,而词汇 “母牛” 出现了 3 次,那么“母牛”一词在该文档中的词频就是 3/100=0.03。计算文件频率 (idf) 的方法是文件集里包含的文件总数除以测定有多少份文件出现过“母牛”一词。所以,如果“母牛”一词在 1000 份文档出现过,而文件总数是 10000000 份的话,其逆向文件频率就是 ln(10000000/1000)=4。最后的 tf-idf 的分数为 0.03×4=0.12。

准备专利数据

专利数据使用的就是之前给大家分享的这个:

1985~2024 年专利申请与授权数据(版本 3,含申请人所处的省市区县):https://rstata.duanshu.com/#/brief/course/2397451274c546d3a36e156ffc865988

使用下面的代码就可以分年读取专利数据、去除重复专利以及保留本次计算所需的变量了:

*- 提取专利数据所需指标
cap mkdir "patent_small3"
forval y = 1985/2024 {
use /Volumes/rstata2t/newIP专利数据分年/`y'.dta, clear
drop if 专利类型 == "外观设计"
drop if mi(IPC)
*- 去除重复专利
gen value = 公开公告号
replace value = subinstr(value, "A", "", .)
replace value = subinstr(value, "B", "", .)
replace value = subinstr(value, "U", "", .)
replace value = subinstr(value, "S", "", .)
duplicates drop value, force

*- 保留所需变量
keep newipzlid IPC 申请日 省 省代码 市 市代码 县 县代码
drop if mi(县代码)
save patent_small3/`y', replace
}

不过由于数据很大,所以附件中仅仅保留了 2010、2011 和 2012 三个年份的。

IPC 与关键数字技术领域

按照参考文献的介绍,计算 TF 的过程如下:

  1. 根据 IPC 匹配每个 IPC 对应的行业小类 -> 根据「国际专利分类与国民经济行业分类参照关系表(2018)」
  2. 根据 IPC 匹配每个 IPC 对应的关键数字技术领域 -> 根据「关键数字技术专利分类体系(2023)」
  3. 计算 TF 公式中的相关指标。

「国际专利分类与国民经济行业分类参照关系表(2018)」的处理在之前的课程「名师讲堂|使用 Stata 测算数实融合水平(二): 基于真实专利数据」中已经进行过了:

名师讲堂|使用 Stata 测算数实融合水平(二): 基于真实专利数据:https://rstata.duanshu.com/#/brief/course/7397f6f81ed24bfab1a39bb9c2796b67

use 专利数据与行业小类代码简易对照表.dta, clear
list in 1/10
*> +---------------------+
*> | uniq_ipc 国民~码 |
*> |---------------------|
*> 1. | G06F15/48 I6532 |
*> 2. | G06F3/03 I6532 |
*> 3. | G06K9/62 I6532 |
*> 4. | G06F3/00 I6532 |
*> 5. | G06F3/01 I6532 |
*> |---------------------|
*> 6. | G06F3/041 I6532 |
*> 7. | G06F3/045 I6532 |
*> 8. | G06K9/24 I6532 |
*> 9. | G06K9/68 I6532 |
*> 10. | G06V10/12 I6532 |
*> +---------------------+

「关键数字技术专利分类体系(2023)」可以从国家知识产权局下载到,附件中也提供了 pdf 文件。

附件中的「关键数字技术专利IPC对照表.dta」文件是从 pdf 中提取的表格:

use 关键数字技术专利IPC对照表.dta, clear
*> (数据处理:微信公众号 RStata)

下面我们把它处理成 ipc - 关键数字领域 的格式:

*- 此处代码需下载讲义材料查看~

不过这样还不能直接使用,这里的 IPC 还只是类别。

uniq_ipc.dta 文件里面存储了所有专利数据的 IPC 号,这个也是上述数实融合课程里面处理得到的:

use uniq_ipc.dta, clear
list in 1/10
*> +-----------+
*> | uniq_ipc |
*> |-----------|
*> 1. | A47G21/10 |
*> 2. | A47G21/00 |
*> 3. | B28B3/22 |
*> 4. | B28B3/20 |
*> 5. | B22D11/06 |
*> |-----------|
*> 6. | B22D11/10 |
*> 7. | B22D11/18 |
*> 8. | A47L13/24 |
*> 9. | A47L13/20 |
*> 10. | G02B21/14 |
*> +-----------+

我们下面的目标就是把每个 IPC 对应上关键数字技术领域:

use 关键核心技术领域IPC分类标准, clear
*> (数据处理:微信公众号 RStata)
gen len = strlen(keyIPC)
tab len
*> len | Freq. Percent Cum.
*> ------------+-----------------------------------
*> 4 | 613 11.98 11.98
*> 5 | 747 14.60 26.59
*> 6 | 1,759 34.39 60.98
*> 7 | 9 0.18 61.15
*> 8 | 332 6.49 67.64
*> 9 | 1,035 20.23 87.88
*> 10 | 468 9.15 97.03
*> 11 | 144 2.82 99.84
*> 12 | 8 0.16 100.00
*> ------------+-----------------------------------
*> Total | 5,115 100.00
cap mkdir "keyIPCtab"
forval i = 4/12 {
preserve
keep if len == `i'
drop len
save keyIPCtab/`i', replace
restore
}

*- uniqIPCtab
cap mkdir "uniqIPCtab"
forval i = 4/12 {
use uniq_ipc.dta, clear
gen keyIPC = substr(uniq_ipc, 1, `i')
joinby keyIPC using keyIPCtab/`i'
save uniqIPCtab/`i', replace
}
*- 合并
appendall uniqIPCtab
*> (777 observations deleted)
drop keyIPC
duplicates drop _all, force
*> Duplicates in terms of uniq_ipc 关键核心技术领域
*> (263,741 observations deleted)
drop if mi(关键核心技术领域)
*> (0 observations deleted)
save "每种IPC对应的关键核心技术领域", replace
*> file 每种IPC对应的关键核心技术领域.dta saved
list in 1/10
*> +---------------------------+
*> | uniq_ipc 关键核心~域 |
*> |---------------------------|
*> 1. | H01L21/205 高端芯片技术 |
*> 2. | H01L21/302 高端芯片技术 |
*> 3. | H01L21/203 高端芯片技术 |
*> 4. | H01L21/365 高端芯片技术 |
*> 5. | H04N21/472 元宇宙技术 |
*> |---------------------------|
*> 6. | H04N21/472 人工智能技术 |
*> 7. | H01L21/312 高端芯片技术 |
*> 8. | H01L21/265 高端芯片技术 |
*> 9. | C01B15/013 高端芯片技术 |
*> 10. | H01L21/306 高端芯片技术 |
*> +---------------------------+

appendall.ado 在附件中有提供,把它放在工作目录下面即可使用。可以用于快速 append 某个文件夹下的所有 dta 文件。

合并下面两个数据:

use 每种IPC对应的关键核心技术领域, clear
joinby uniq_ipc using 专利数据与行业小类代码简易对照表, unmatched(both)
tab _m
drop if mi(国民经济行业代码)
drop _m
save classdf, replace
list in 1/10

这样就同时知道了每个 IPC 对应的关键数字领域和行业。

处理专利数据

由于专利数据中的 IPC 分类号是用分号分隔的,所以我们需要先把它们分隔开:

*- 选择 2010-2012年数据为例:
use patent_small3/2010.dta, clear
*> (数据处理:微信公众号 RStata)
append using patent_small3/2011.dta
*> (variable newipzlid was str10, now str11 to accommodate using data's values)
*> (variable IPC was str733, now str891 to accommodate using data's values)
append using patent_small3/2012.dta
drop if mi(IPC)
*> (0 observations deleted)
compress
*> variable 省代码 was double now long
*> variable 市代码 was double now long
*> variable 县代码 was double now long
*> (24,342,384 bytes saved)
keep newipzlid IPC 申请日
save tempdata, replace
*> (file tempdata.dta not found)
*> file tempdata.dta saved

拆分 IPC:

*- 此处代码需下载讲义材料查看~

然后就可以直接把 v3 创建成变量了:

mata:
stata("cap drop IPC")
st_addvar("strL", "IPC")
st_sstore(., "IPC", v3')
end
drop n
duplicates drop _all, force
*> Duplicates in terms of newipzlid 申请日 IPC
*> (0 observations are duplicates)
*- 合并两部分
append using tempdata1
gsort newipzlid
save tempdata2, replace
*> (file tempdata2.dta not found)
*> file tempdata2.dta saved
list in 1/5
*> +-------------------------------------+
*> | newipzlid 申请日 IPC |
*> |-------------------------------------|
*> 1. | 2010000002 2010-06-02 A47J37/08 |
*> 2. | 2010000003 2010-01-28 A47J37/10 |
*> 3. | 2010000004 2010-06-18 A47J37/12 |
*> 4. | 2010000005 2010-06-18 A21B5/08 |
*> 5. | 2010000005 2010-06-18 A47J37/12 |
*> +-------------------------------------+

匹配行业:

*- 此处代码需下载讲义材料查看~

然后就可以计算 TF 公式里面的各个变量了:

use tempdata3, clear
*> (数据处理:微信公众号 RStata)
*- 每个专利 IPC 所涉及的关键核心技术领域数量
bysort newipzlid: egen C_pwt = nvals(关键核心技术领域)
*> (7,284,048 missing values generated)
replace C_pwt = 0 if mi(C_pwt)
*> (7,284,048 real changes made)
*- 每个专利 IPC 所涉及的所有技术领域数量
bysort newipzlid: egen C_pt = nvals(国民经济行业代码)
*- 截止 t 年的专利数量
gen year = substr(newipzlid, 1, 4)
destring year, replace
*> year: all characters numeric; replaced as int
order year
destring newipzlid, replace
*> newipzlid: all characters numeric; replaced as double
save tempdata4, replace
*> (file tempdata4.dta not found)
*> file tempdata4.dta saved
use tempdata4, clear
*> (数据处理:微信公众号 RStata)
bysort year: egen patents_t = nvals(newipzlid)
keep year patents_t
duplicates drop _all, force
*> Duplicates in terms of year patents_t
*> (27,231,460 observations deleted)
gsort year
replace patents_t = sum(patents_t)
*> (2 real changes made)
save tempdata5, replace
*> (file tempdata5.dta not found)
*> file tempdata5.dta saved
*- 截至 t 年,包含技术领域 w 的专利数
use tempdata4, clear
*> (数据处理:微信公众号 RStata)
drop if mi(关键核心技术领域)
*> (7,284,048 observations deleted)
bysort year 关键核心技术领域: egen patents_wt = nvals(newipzlid)
keep year 关键核心技术领域 patents_wt
duplicates drop _all, force
*> Duplicates in terms of year 关键核心技术领域 patents_wt
*> (19,947,394 observations deleted)
bysort 关键核心技术领域: replace patents_wt = sum(patents_wt)
*> (14 real changes made)
save tempdata6, replace
*> (file tempdata6.dta not found)
*> file tempdata6.dta saved
*- 合并 tempdata4、tempdata5、tempdata6
use tempdata4, clear
*> (数据处理:微信公众号 RStata)
merge m:1 year using tempdata5
*> Result Number of obs
*> -----------------------------------------
*> Not matched 0
*> Matched 27,231,463 (_merge==3)
*> -----------------------------------------
drop _m
merge m:1 year 关键核心技术领域 using tempdata6
*> Result Number of obs
*> -----------------------------------------
*> Not matched 7,284,048
*> from master 7,284,048 (_merge==1)
*> from using 0 (_merge==2)
*> Matched 19,947,415 (_merge==3)
*> -----------------------------------------
drop _m
drop if mi(patents_wt)
*> (7,284,048 observations deleted)
gen z = log(patents_t/patents_wt) * C_pwt / C_pt
keep newipzlid 关键核心技术领域 z 申请日
gsort newipzlid 关键核心技术领域
duplicates drop _all, force
*> Duplicates in terms of newipzlid 申请日 关键核心技术领域 z
*> (18,008,601 observations deleted)
spread 关键核心技术领域 z
foreach i of varlist _all {
*> 2. cap replace `i' = 0 if mi(`i')
*> 3. }
tostring newipzlid, replace format(%12.0f)
*> newipzlid was double now str11
save tempdata7, replace
*> (file tempdata7.dta not found)
*> file tempdata7.dta saved

这样我们就得到了每个专利的各个关键数字技术领域的 TF-IDF 指标,如果某个维度的指标值很高,就表示这个领域在该专利中出现的次数多,而在其他专利中出现的较少。这里其实也就是相当于把关键数字技术领域看作术语,然后每个专利的 IPC 集合看作一篇文档。

下次课程我们会继续讲解如何计算每个专利的前瞻与回溯相似度。

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(一)

评论