CN117114003A - 一种基于Trie树的许可证识别方法、系统及介质 - Google Patents
一种基于Trie树的许可证识别方法、系统及介质 Download PDFInfo
- Publication number
- CN117114003A CN117114003A CN202311260639.9A CN202311260639A CN117114003A CN 117114003 A CN117114003 A CN 117114003A CN 202311260639 A CN202311260639 A CN 202311260639A CN 117114003 A CN117114003 A CN 117114003A
- Authority
- CN
- China
- Prior art keywords
- license
- list
- character string
- node
- name
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 44
- 230000009191 jumping Effects 0.000 claims description 17
- 238000010606 normalization Methods 0.000 claims description 17
- 238000004590 computer program Methods 0.000 claims description 11
- 238000012545 processing Methods 0.000 claims description 11
- 230000011218 segmentation Effects 0.000 claims description 9
- 238000005192 partition Methods 0.000 claims 1
- 238000010586 diagram Methods 0.000 description 8
- 230000018109 developmental process Effects 0.000 description 5
- 230000006870 function Effects 0.000 description 4
- 239000000284 extract Substances 0.000 description 3
- 238000013461 design Methods 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 208000025174 PANDAS Diseases 0.000 description 1
- 208000021155 Paediatric autoimmune neuropsychiatric disorders associated with streptococcal infection Diseases 0.000 description 1
- 240000000220 Panda oleosa Species 0.000 description 1
- 235000016496 Panda oleosa Nutrition 0.000 description 1
- 230000006978 adaptation Effects 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 238000012550 audit Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000012502 risk assessment Methods 0.000 description 1
- 238000010845 search algorithm Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/279—Recognition of textual entities
- G06F40/289—Phrasal analysis, e.g. finite state techniques or chunking
- G06F40/295—Named entity recognition
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/31—Indexing; Data structures therefor; Storage structures
- G06F16/316—Indexing structures
- G06F16/322—Trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/33—Querying
- G06F16/3331—Query processing
- G06F16/334—Query execution
- G06F16/3344—Query execution using natural language analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/22—Matching criteria, e.g. proximity measures
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Artificial Intelligence (AREA)
- Databases & Information Systems (AREA)
- Computational Linguistics (AREA)
- Software Systems (AREA)
- Health & Medical Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Life Sciences & Earth Sciences (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Bioinformatics & Computational Biology (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Evolutionary Biology (AREA)
- Evolutionary Computation (AREA)
- Machine Translation (AREA)
Abstract
本发明公开了一种基于Trie树的许可证识别方法、系统及介质,本发明基于Trie树的许可证识别方法包括:获取开源许可证的许可证名称集合;以空格符分割许可证名称集合中的许可证名称,根据分割得到的字符串列表构造Trie树,并对版本号、名称进行标记;从项目源文件中提取待匹配语句集合;基于多模式文本匹配算法扫描待匹配语句集合中的许可证声明语句以识别出其中的许可证名称,且通过联系列表com与参考列表ref列表实现许可证名称最长子串匹配与无版本信息的许可证名称匹配,并将匹配项目加入资源列表res并作为最终识别结果输出。本发明旨在高效、准确地识别出项目源文件中的许可证名称。
Description
技术领域
本发明属于开源软件许可证的字符串匹配及许可证识别技术领域,具体涉及一种基于Trie树的许可证识别方法、系统及介质。
背景技术
随着开源社区的蓬勃发展,在软件开发过程中引入开源组件已成为降低研发成本、提高生产效率的一种重要途径。根据Synopsys 2023年发布的《开源安全和风险分析》(OSSRA)报告,96%的商业代码中包含开源组件,使用Black Duck审计服务扫描的代码中有76%是开源的。由此可见,在软件开发过程中引用开源组件已成为一种趋势。
开源并不意味着可以免费或者共享,开源组件中的开源许可证是开源代码的作者或版权所有者对使用开源代码的约束,规定了复用、修改或分发开源代码所需遵守的条件。在使用开源代码过程中,需接受开源许可证的约束,若使用开源代码的过程中违反许可证条款或者软件开发过程中引入的多个开源组件的许可证条款之间存在冲突,则可能面临法律风险。例如GPLv3.0许可证要求所有衍生品必须以GPLv3.0许可证进行分发,而CDDLv1.1许可证要求其代码和其他许可证的代码整合在一起后,整个作品必须以CDDLv1.1分发,如果同时引用了包含这两个许可证的开源组件就会导致许可证冲突。
为避免因违反许可证条款或许可证条款冲突而引起的法律风险,需识别出软件源代码中的开源许可证,为许可证的合规性与兼容性分析提供支撑。由于现代软件需要应对越来越复杂的业务需求和数据处理需求,并且需要不断更新和维护以满足用户的需求,其规模大小与复杂程度日益提升,人工识别软件中开源许可证的效率难以满足需求。为提高许可证识别效率,部分开源社区和商业公司研发了相关的许可证识别工具,通过各种匹配算法,自动化地识别软件中的开源许可证,如Fossology、Ninka、Go License Detector等。
开源许可证的识别主要是利用开源许可证的3种特征,即许可证Identifier、许可证名称和许可证文本,通过匹配算法识别侯选文本中是否包含某种许可证的某种特征确定该文本中包含相关许可证的声明信息。目前的许可证识别工具采用的匹配算法根据其识别特征的种类可分为2类,一种是可识别多种特征的匹配算法,如Fossology中的Nomos模式和Ninka工具对文本中包含的3种特征均可识别;另一种仅识别单一特征匹配算法,如Fossology的Ojo模式仅识别许可证Identifier、Fossology的Monk模式和Go LicenseDetector仅识别许可证文本。识别多种特征的匹配算法由于兼顾各种特征的差异,其效率与准确率不够理想,针对单一特征的匹配算法只针对某种特定的特征设计,能够实现更高的匹配效率,通过组合使用许可证Identifier、许可证名称、许可证文本的单一特征匹配算法,可更加高效准确地识别软件中的开源许可证。目前有针对许可证Identifier、许可证文本的匹配算法,但尚无针对许可证名称的匹配方法。
发明内容
本发明要解决的技术问题:针对现有技术的上述问题,提供一种基于Trie树的许可证识别方法、系统及介质,本发明旨在高效、准确地识别出项目源文件中的许可证名称。
为了解决上述技术问题,本发明采用的技术方案为:
一种基于Trie树的许可证识别方法,包括:
S101,获取开源许可证的许可证名称集合;
S102,以空格符分割许可证名称集合中的许可证名称,根据分割得到的字符串列表构造Trie树,并对版本号用字符串“license”标记、名称用字符串“license name”标记;
S103,从项目源文件中提取待匹配语句集合;
S104,基于面向Trie树设计的多模式文本匹配算法扫描待匹配语句集合中的许可证声明语句以识别出其中的许可证名称并通过设置最大跳跃间隔实现不连续的字符串匹配,且通过联系列表com与参考列表ref列表实现许可证名称最长子串匹配与无版本信息的许可证名称匹配,并将匹配项目加入资源列表res,并将资源列表res作为最终识别结果输出。
可选地,步骤S101包括:
S201,获取包含开源许可证信息的网页网址;
S202,根据包含开源许可证信息的网页网址,从对应的网页中读取开源许可证的数据;
S203,从开源许可证的数据中提取开源许可证的许可证名称集合。
可选地,步骤S102包括:
S301,遍历许可证名称集合,以空格符分割许可证名称,将每个许可证名称分割为若干字符串组成的字符串列表;
S302,对所有许可证名称分割得到的字符串列表进行标准化处理;
S303,创建Trie树的根结点,结点名称为空字符;
S304,依次读入单个许可证名称的字符串列表中字符串,针对读入的当前字符串:从根结点开始遍历Trie树,查找当前字符串对应的子结点是否存在,若存在,则直接将当前结点移动到该子结点,否则先创建该子结点、再将当前结点移动到该子结点;创建子结点之前根据当前字符串是否版本号判断是否标记当前结点为“license”,若当前字符串为版本号,则标记当前结点为“license”;若单个字符串列表中的字符串读取完毕,则用字符串“license name”标记当前结点;
S305,跳转步骤S304直至许可证集合中所有许可证的字符串列表都读取完毕。
可选地,步骤S302中对所有许可证名称分割得到的字符串列表进行标准化处理包括:字母形式标准化,包括:将许可证名称字符串中的字母全部转换为小写字母;许可证后缀标准化,包括:若许可证名称的字符串列表以“only”结尾,则移除字符串“only”;许可证版本标准化,包括:版本号统一用小数表示。
可选地,步骤S103包括:
S401,解析项目源文件,根据项目源文件的目录结构构建目录树;
S402,遍历目录树,对于其中的许可证文件license、版权文件copyright、读我文件readme提取其全部文本作为侯选文本,其余源代码文件则提部代码头部注释作为侯选文本;
S403,将侯选文本分割为语句集;
S404,根据许可证声明的常用句式定义关键词集合;
S405,扫描语句集,将包含关键词集合中关键词的语句提取出来作为待匹配语句集合。
可选地,步骤S104包括:
S501,对待匹配语句集合中的待匹配语句进行分词得到字符串列表;
S502,将待匹配语句的字符串列表进行标准化处理;
S503,初始化当前结点为根结点、计数器为0、缓存队列为空;
S504,查看字符串列表中的字符串是否读取完毕,若读取完毕,则跳转到步骤S508;否则在字符串列表中按序读取字符串,并执行步骤S505;
S505,当前结点的孩子结点中查找读取的当前字符串以确定,读取的当前字符串在当前结点的孩子结点中是否存在,若存在则跳转步骤S506;否则跳转步骤S507;
S506,将读取的当前字符串转移到当前结点的孩子结点,并检查当前结点状态:若当前结点标记为“license”,则将其添加到参考列表ref;若当前结点标记为“licensename”,判断其是否有孩子结点,若无则将其添加到资源列表res,若有则将其加入到联系列表com;最终,跳转步骤S504;
S507,查看当前结点是否为根结点,若当前结点为根结点,则跳转到步骤S504;若当前结点非根结点,则计数器加1并将读取字符串加入缓存队列,并判断计数器是否达到允许的最大跳跃间隔max_interval,若未达到,则跳转到步骤S504,若达到则将缓存队列中的字符串加入字符串列表,并跳转到步骤S503;
S508,比较联系列表com与资源列表res中的结果,实现最长子串匹配,如果联系列表com中的某个“license name”不是资源列表res中任意“license name”的子串,则将该许可证名称加入资源列表res;
S509,比较参考列表ref与资源列表res中的结果,实现无版本信息的许可证匹配,如果参考列表ref中的某个“license”项目不是资源列表res中任意“license name”的子串,则将参考列表ref中的该“license”项目加入资源列表res,并将资源列表res作为最终识别结果输出。
可选地,步骤S501中对待匹配语句集合中的待匹配语句进行分词是指对待匹配语句集合中的待匹配语句使用nltk工具中tokenize库中的word_tokenize方法对语句进行分词。
可选地,步骤S502中将待匹配语句的字符串列表进行标准化处理包括:字母形式标准化,包括:将许可证名称字符串中的字母全部转换为小写字母;许可证版本标准化,包括:版本号统一用小数表示。
此外,本发明还提供一种基于Trie树的许可证识别系统,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行所述基于Trie树的许可证识别方法。
此外,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序用于被微处理器编程或配置以执行所述基于Trie树的许可证识别方法。
和现有技术相比,本发明主要具有下述优点:
1、本发明包括基于许可证名称集合构造Trie树,并根据Trie树设计了字符串匹配算法,可高效准确地匹配文本中的许可证名称,通过设置最大跳跃间隔实现不连续的字符串匹配使之更为灵活,匹配完成后通过联系列表com与参考列表ref实现许可证名称最长子串匹配与无版本信息的许可证名称匹配;以关键词集合定位与许可证相关的语句作为侯选文本,缩小匹配范围进一步提高许可证识别效率。
2、本发明包括获取开源许可证的许可证名称集合,即:每次实施前获取最新许可证名称集合,使其可匹配的许可证种类动态增长。
附图说明
图1为本发明实施例方法的基本流程示意图。
图2为本发明实施例中构造Trie树流程示意图。
图3为本发明实施例中提取许可证声明语句流程示意图。
图4为本发明实施例中提取侯选文本流程示意图。
图5为本发明实例中许可证名称匹配流程示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图和实施例对本发明进行进一步详细说明。
如图1所示,本实施例基于Trie树的许可证识别方法包括:
S101,获取开源许可证的许可证名称集合;
S102,根据许可证名称集合构造Trie树:以空格符分割许可证名称集合中的许可证名称,根据分割得到的字符串列表构造Trie树,并对版本号用字符串“license”标记、名称用字符串“license name”标记;
S103,从项目源文件中提取待匹配语句集合;
S104,基于Trie树设计多模式文本匹配算法,扫描许可证声明语句以识别出其中的许可证名称:基于面向Trie树设计的多模式文本匹配算法扫描待匹配语句集合中的许可证声明语句以识别出其中的许可证名称并通过设置最大跳跃间隔实现不连续的字符串匹配,且通过联系列表com与参考列表ref列表实现许可证名称最长子串匹配与无版本信息的许可证名称匹配,并将匹配项目加入资源列表res,并将资源列表res作为最终识别结果输出。
需要说明的是,步骤S101中的获取开源许可证名称集合可根据需要从不同渠道获取,通过从包含开源许可证信息的网页中在线提取许可证名称集合是一种优选的实施方式,通过在线提取的方式可实时获得网页中许可证,避免因更新不及时导致识别时的漏报。
本实施例中,步骤S101包括:
S201,获取包含开源许可证信息的网页网址;
本实施例中采用Linux基金会的SPDX(Software Package Data Exchange)项目对外提供的网址https://spdx.org/licenses/作为开源许可证名称集合的来源,实际应用时也可采用其它包含开源许可证信息的网页作为数据来源;
S202,根据包含开源许可证信息的网页网址,从对应的网页中读取开源许可证的数据;
从输入的包含开源许可证信息的网页中读取许可证信息的数据,例如本实施例中输入的网页中许可证信息以表格形式存储,可采用Python语言的pandas库中的read_html()方法直接读取网页中的表格;
S203,从开源许可证的数据中提取开源许可证的许可证名称集合。
读取的许可证信息数据一般包含许可证名称、许可证文本等多种与许可证相关的信息,例如本实施例中读取的表格中包含“Fullname”、“Identifier”、“FSF Free/Libre?”、“OSI Approved?”等字段,其中“Fullname”字段即为许可证名称,因此直接从读取的表格中提取该字段得到许可证名称集合。
如图2所示,本实施例的步骤S101包括:
S301,遍历许可证名称集合,以空格符分割许可证名称,将每个许可证名称分割为若干字符串组成的字符串列表;
S302,对所有许可证名称分割得到的字符串列表进行标准化处理;
S303,创建Trie树的根结点,结点名称为空字符;许可证名称由若干字符串组成,字符串之间以空格符连接,通过空格符将许可证名称分割后可得到字符串列表,列表中的每个字符串都可由Trie树中的一个状态结点表示;根结点是Trie树的初始状态结点,用于判断侯选文本中的字符串是否与许可证名称相关,若当前字符串能在根结点的子结点中查找到,则进行Trie树开始查找,否则状态一起保持在根结点;
S304,依次读入单个许可证名称的字符串列表中字符串,针对读入的当前字符串:从根结点开始遍历Trie树,查找当前字符串对应的子结点是否存在,若存在,则直接将当前结点移动到该子结点,否则先创建该子结点、再将当前结点移动到该子结点;创建子结点之前根据当前字符串是否版本号判断是否标记当前结点为“license”,若当前字符串为版本号,则标记当前结点为“license”;若单个字符串列表中的字符串读取完毕,则用字符串“license name”标记当前结点;
S305,跳转步骤S304直至许可证集合中所有许可证的字符串列表都读取完毕。
由于开发者习惯不同,使用同一个许可证的名称可能在表达方式上存在一定差异,为避免因表达方式上的差异而导致许可证识别时的漏报,需对许可证名称产生了字符串列表进行标准化处理。步骤S302中对所有许可证名称分割得到的字符串列表进行标准化处理包括:字母形式标准化,包括:将许可证名称字符串中的字母全部转换为小写字母;许可证后缀标准化,包括:若许可证名称的字符串列表以“only”结尾,则移除字符串“only”;许可证版本标准化,包括:版本号统一用小数表示。标准化处理主要对应于3种差异,一是由于字母的大小写形式而产生的差异,通过将所有字母转换为小写字母,实现字母形式的标准化;二是用于区分许可证名称的后缀在实际应用时可能存在,也可能不存在,如gnugeneral public license v2.0 only中的后缀“only”只是为了与gnu general publiclicense v2.0 or later区分,针对这种情况,直接去除相关后缀,实现许可证名称后缀的标准化;三是许可证版本号表现形式的差异,使用时既可能使用整数,也可能使用浮点数,如“version 2”与“version 2.0”表达的是相同版本,这里将其统一转换为浮点数,实现许可证版本的标准化。
步骤S304中依次读入单个许可证的字符串列表中字符串,从根结点开始遍历Trie树,查找当前字符串对应的子结点是否存在,若存在,则将当前结点移动到该子结点,否则创建该子结点,将当前结点移动到该子结点;考虑到部分开发者声明许可证时可能忽略掉许可证版本信息,为识别出这类情况,要标记出表示版本信息的状态结点的父结点,表示识别到该结点为一个缺省版本信息的许可证,本实施例中通过正则表达式匹配判断当前读入的字符串是否表示许可证版本信息,若表示版本信息,则当前状态结点即为表示版本信息状态结点的父结点,将当前结点标记为“license”;单个许可证的字符串列表读取完毕后,当前结点应为终态结点,表示若识别到当前结点,则匹配出该许可证的名称,因此使用该许可证名称标记该终态结点。
如图3所示,本实施例的步骤S103包括:
S401,解析项目源文件,根据项目源文件的目录结构构建目录树;根据项目源文件的目录结构构建目录树时,包括为每个文件生成唯一标识用于标记该文件,本实施例中采用文件的文件名、文件大小、文件最近修改时间拼接的字符串的md5哈希值作为其标识;
S402,遍历目录树,对于其中的许可证文件license、版权文件copyright、读我文件readme提取其全部文本作为侯选文本,其余源代码文件则提部代码头部注释作为侯选文本;开源许可证声明的位置主要有两类,一类是在项目文件中(如许可证文件license、版权文件copyright、读我文件readme),另一类则是在源代码文件的头部注释中,因此本实施例中遍历目录树中文件,若当前文件许可证文件license、版权文件copyright、读我文件readme提取其全部文本作为侯选文本,若是其它的源代码文件则提取其头部注释作为侯选文本;
S403,将侯选文本分割为语句集;侯选文本中还包含一些与许可证无关的内容,而使用许可证名称的声明只在单个语句内,因此将提取的文本分割为语句集,便于下步从语句集中定位到许可证声明语句。本实施例中使用nltk工具中tokenize库中的sent_tokenize方法对文本进行分割,得到语句集;
S404,根据许可证声明的常用句式定义关键词集合;例如,通过分析常见的许可证声明语句可总结出若干通用的句式,如“you can redistribute it and/or modify itunder the terms of……license”,根据语义“under”和“license”与许可证名称的相关性最强,可将其定义为关键词,按此方法对各种句式定义关键词即可得到关键词集合;
S405,扫描语句集,将包含关键词集合中关键词的语句提取出来作为待匹配语句集合。通过分析常见的许可证声明语句可总结出若干通用的句式,如“you canredistribute it and/or modify it under the terms of……license”,根据语义“under”和“license”与许可证名称的相关性最强,可将其定义为关键词,按此方法对各种句式定义关键词即可得到关键词集合,即待匹配语句集合。
如图4所示,本实施例的步骤S402包括:遍历目录树中的文件。若当前文件为许可证文件license、版权文件copyright、读我文件readme,则提取其全部文本作为侯选文本。若当前文件是其它源代码文件,则提取其头部注释。由于不同的编程语言有不同的注释符,因此定义了注释符集合,集合包含块注释符与行注释符2个子集,其中块注释符是成对出现的,而行注释符则由单一字符或字符串构成。从文件的第1行判断,若第一个注释符是块注释符,则找到其对应的另一个块注释符,提取之间的文本作为头部注释;若第一个注释符为行注释符,则继续读取下一行,直到没有行注释符为止,如此将连续的单行注释作为文本头部注释。
本实施例中面向Trie树设计了一种允许跳跃的字符串搜索算法实现许可证名称的多模式匹配,根据预定义的关键词从项目源文件中提取与许可证名称相关的语句作为待匹配语句集合缩小匹配范围,将待匹配语句集合作为匹配算法的输入可高效、准确地识别出语句中的许可证名称。具体如图5所示,本实施例的步骤S104包括:
S501,对待匹配语句集合中的待匹配语句进行分词得到字符串列表;本实施例中,步骤S501中对待匹配语句集合中的待匹配语句进行分词是指对待匹配语句集合中的待匹配语句使用nltk工具中tokenize库中的word_tokenize方法对语句进行分词;
S502,将待匹配语句的字符串列表进行标准化处理;
S503,初始化当前结点为根结点、计数器为0(count=0)、缓存队列为空(queue=[]);
S504,查看字符串列表中的字符串是否读取完毕,若读取完毕,则跳转到步骤S508;否则在字符串列表中按序读取字符串,并执行步骤S505;
S505,当前结点的孩子结点中查找读取的当前字符串以确定,读取的当前字符串在当前结点的孩子结点中是否存在,若存在则跳转步骤S506;否则跳转步骤S507;
S506,将读取的当前字符串转移到当前结点的孩子结点,并检查当前结点状态:若当前结点标记为“license”,则将其添加到参考列表ref;若当前结点标记为“licensename”,判断其是否有孩子结点,若无则将其添加到资源列表res,若有则将其加入到联系列表com;最终,跳转步骤S504;
S507,查看当前结点是否为根结点,若当前结点为根结点,则跳转到步骤S504;若当前结点非根结点,则计数器加1并将读取字符串加入缓存队列,并判断计数器是否达到允许的最大跳跃间隔max_interval,若未达到,则跳转到步骤S504,若达到则将缓存队列中的字符串加入字符串列表,并跳转到步骤S503;
S508,比较联系列表com与资源列表res中的结果,实现最长子串匹配,如果联系列表com中的某个“license name”不是资源列表res中任意“license name”的子串,则将该许可证名称加入资源列表res;
S509,比较参考列表ref与资源列表res中的结果,实现无版本信息的许可证匹配,如果参考列表ref中的某个“license”项目不是资源列表res中任意“license name”的子串,则将参考列表ref中的该“license”项目加入资源列表res,并将资源列表res作为最终识别结果输出。
本实施例中,步骤S502中将待匹配语句的字符串列表进行标准化处理包括:字母形式标准化,包括:将许可证名称字符串中的字母全部转换为小写字母;许可证版本标准化,包括:版本号统一用小数表示。例如,对字符串列表中的字符串进行标准化,首先将字符串全部转换为小写字母,接着使用正则表达式“version|\d+(\.\d+)*|v\d+(\.\d+)*”定位到表示许可证版本信息字符串上,若该字符串为整数形式则将其替换为小数形式。
在当前结点的孩子结点中查找读取的字符串的情况包括:
A.若查找成功,则转移到对应孩子结点,并检查当前结点状态:
a.若当前结点标记为“license”,如“gun general public license”则将其添加到ref列表,跳转到步骤S504;
b.若当前结点标记为“license name”,判断其是否有孩子结点,若无(如“gnugeneral public license v2.0 or later”)则将其添加到res列表,若有(如“gnu generalpublic license v2.0”)则将其加入到com列表,跳转步骤S504;
c.若当前结点无标记,直接跳转到步骤S504;
B.若查找失败,查看当前结点是否为根结点;
a.若当前结点为根结点,则跳转到步骤S504;
b.若当前结点非根结点,则计数器count加1并将读取字符串加入缓存队列queue,并判断count是否达到最大间隔max_interval,若未达到,则跳转到步骤S504,若达到则将缓存队列queue中的字符串插入到字符串列表前端,并跳转到步骤S503。
步骤S508中比较联系列表com与资源列表res中的结果,实现最长子串匹配,如果联系列表com中的某个“license name”不是资源列表res中任意“license name”的子串,则将该许可证名称加入资源列表res,如识别到“gnu general public license v2.0”时,由于结点“v2.0”还有子结点,因此未将其加入到资源列表res,而是添加到比较联系列表com,此时比较联系列表com与资源列表res,若未识别出“v2.0”后的子结点,则将“gnu generalpublic license v2.0”加入到资源列表res。
步骤S509中比较参考列表ref与资源列表res,实现无版本信息的许可证匹配。如果参考列表ref中的某个“license”不是资源列表res中任意“license name”的子串,则将ref+“license”(参考列表ref中的该“license”项目)加入资源列表res,此时资源列表res即为最终识别结果。如识别到“gnu general public license”将其加入到参考列表ref,若资源列表res中无包含版本信息的gpl许可证,则将“ref gnu general public license”加入到资源列表res。
综上所述,开源许可证识别是保证开源许可证合规使用、许可证之间相互兼容的前提,随着软件规模的不断扩大,开源许可证识别效率有待提高。开源许可证在源文件中的表现形式可分为许可证Identifier、许可证名称及许可证文本,针对不同形式采用不同的匹配算法可提高识别效率,目前已有面向许可证Identifier及许可证文本的识别方法,尚无面向许可证名称的识别算法。针对以上问题,本实施例提供了一种基于Trie树的面向许可证名称的开源许可证识别方法,该方法从SPDX开源许可证列表中提取许可证名称集合,根据许可证名称集合构造Trie树,基于Trie树设计了匹配算法,可灵活、高效、准确地识别出待匹配文本中的许可证。同时,利用关键词集合从源文件中提取与许可证相关的语句作为待匹配语句,缩小了匹配范围,进一步提高了识别效率。
此外,本实施例还提供一种基于Trie树的许可证识别系统,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行所述基于Trie树的许可证识别方法。此外,本实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序用于被微处理器编程或配置以执行所述基于Trie树的许可证识别方法。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可读存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种基于Trie树的许可证识别方法,其特征在于,包括:
S101,获取开源许可证的许可证名称集合;
S102,以空格符分割许可证名称集合中的许可证名称,根据分割得到的字符串列表构造Trie树,并对版本号用字符串“license”标记、名称用字符串“license name”标记;
S103,从项目源文件中提取待匹配语句集合;
S104,基于面向Trie树设计的多模式文本匹配算法扫描待匹配语句集合中的许可证声明语句以识别出其中的许可证名称并通过设置最大跳跃间隔实现不连续的字符串匹配,且通过联系列表com与参考列表ref列表实现许可证名称最长子串匹配与无版本信息的许可证名称匹配,并将匹配项目加入资源列表res,并将资源列表res作为最终识别结果输出。
2.根据权利要求1所述的基于Trie树的许可证识别方法,其特征在于,步骤S101包括:
S201,获取包含开源许可证信息的网页网址;
S202,根据包含开源许可证信息的网页网址,从对应的网页中读取开源许可证的数据;
S203,从开源许可证的数据中提取开源许可证的许可证名称集合。
3.根据权利要求1所述的基于Trie树的许可证识别方法,其特征在于,步骤S102包括:
S301,遍历许可证名称集合,以空格符分割许可证名称,将每个许可证名称分割为若干字符串组成的字符串列表;
S302,对所有许可证名称分割得到的字符串列表进行标准化处理;
S303,创建Trie树的根结点,结点名称为空字符;
S304,依次读入单个许可证名称的字符串列表中字符串,针对读入的当前字符串:从根结点开始遍历Trie树,查找当前字符串对应的子结点是否存在,若存在,则直接将当前结点移动到该子结点,否则先创建该子结点、再将当前结点移动到该子结点;创建子结点之前根据当前字符串是否版本号判断是否标记当前结点为“license”,若当前字符串为版本号,则标记当前结点为“license”;若单个字符串列表中的字符串读取完毕,则用字符串“licensename”标记当前结点;
S305,跳转步骤S304直至许可证集合中所有许可证的字符串列表都读取完毕。
4.根据权利要求3所述的基于Trie树的许可证识别方法,其特征在于,步骤S302中对所有许可证名称分割得到的字符串列表进行标准化处理包括:字母形式标准化,包括:将许可证名称字符串中的字母全部转换为小写字母;许可证后缀标准化,包括:若许可证名称的字符串列表以“only”结尾,则移除字符串“only”;许可证版本标准化,包括:版本号统一用小数表示。
5.根据权利要求1所述的基于Trie树的许可证识别方法,其特征在于,步骤S103包括:
S401,解析项目源文件,根据项目源文件的目录结构构建目录树;
S402,遍历目录树,对于其中的许可证文件license、版权文件copyright、读我文件readme提取其全部文本作为侯选文本,其余源代码文件则提部代码头部注释作为侯选文本;
S403,将侯选文本分割为语句集;
S404,根据许可证声明的常用句式定义关键词集合;
S405,扫描语句集,将包含关键词集合中关键词的语句提取出来作为待匹配语句集合。
6.根据权利要求3所述的基于Trie树的许可证识别方法,其特征在于,步骤S104包括:
S501,对待匹配语句集合中的待匹配语句进行分词得到字符串列表;
S502,将待匹配语句的字符串列表进行标准化处理;
S503,初始化当前结点为根结点、计数器为0、缓存队列为空;
S504,查看字符串列表中的字符串是否读取完毕,若读取完毕,则跳转到步骤S508;否则在字符串列表中按序读取字符串,并执行步骤S505;
S505,当前结点的孩子结点中查找读取的当前字符串以确定,读取的当前字符串在当前结点的孩子结点中是否存在,若存在则跳转步骤S506;否则跳转步骤S507;
S506,将读取的当前字符串转移到当前结点的孩子结点,并检查当前结点状态:若当前结点标记为“license”,则将其添加到参考列表ref;若当前结点标记为“license name”,判断其是否有孩子结点,若无则将其添加到资源列表res,若有则将其加入到联系列表com;最终,跳转步骤S504;
S507,查看当前结点是否为根结点,若当前结点为根结点,则跳转到步骤S504;若当前结点非根结点,则计数器加1并将读取字符串加入缓存队列,并判断计数器是否达到允许的最大跳跃间隔max_interval,若未达到,则跳转到步骤S504,若达到则将缓存队列中的字符串加入字符串列表,并跳转到步骤S503;
S508,比较联系列表com与资源列表res中的结果,实现最长子串匹配,如果联系列表com中的某个“license name”不是资源列表res中任意“license name”的子串,则将该许可证名称加入资源列表res;
S509,比较参考列表ref与资源列表res中的结果,实现无版本信息的许可证匹配,如果参考列表ref中的某个“license”项目不是资源列表res中任意“license name”的子串,则将参考列表ref中的该“license”项目加入资源列表res,并将资源列表res作为最终识别结果输出。
7.根据权利要求6所述的基于Trie树的许可证识别方法,其特征在于,步骤S501中对待匹配语句集合中的待匹配语句进行分词是指对待匹配语句集合中的待匹配语句使用nltk工具中tokenize库中的word_tokenize方法对语句进行分词。
8.根据权利要求6所述的基于Trie树的许可证识别方法,其特征在于,步骤S502中将待匹配语句的字符串列表进行标准化处理包括:字母形式标准化,包括:将许可证名称字符串中的字母全部转换为小写字母;许可证版本标准化,包括:版本号统一用小数表示。
9.一种基于Trie树的许可证识别系统,包括相互连接的微处理器和存储器,其特征在于,所述微处理器被编程或配置以执行权利要求1~8中任意一项所述基于Trie树的许可证识别方法。
10.一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其特征在于,所述计算机程序用于被微处理器编程或配置以执行权利要求1~8中任意一项所述基于Trie树的许可证识别方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311260639.9A CN117114003A (zh) | 2023-09-26 | 2023-09-26 | 一种基于Trie树的许可证识别方法、系统及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311260639.9A CN117114003A (zh) | 2023-09-26 | 2023-09-26 | 一种基于Trie树的许可证识别方法、系统及介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117114003A true CN117114003A (zh) | 2023-11-24 |
Family
ID=88811142
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311260639.9A Pending CN117114003A (zh) | 2023-09-26 | 2023-09-26 | 一种基于Trie树的许可证识别方法、系统及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117114003A (zh) |
-
2023
- 2023-09-26 CN CN202311260639.9A patent/CN117114003A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10169337B2 (en) | Converting data into natural language form | |
RU2605077C2 (ru) | Способ и система для хранения и поиска информации, извлекаемой из текстовых документов | |
US7882119B2 (en) | Document alignment systems for legacy document conversions | |
CN109885479B (zh) | 基于路径记录截断的软件模糊测试方法及装置 | |
CN106843840B (zh) | 一种基于相似度分析的源代码版本演化注释复用方法 | |
JP2005018780A (ja) | 構造化文書オーサリングのためのシステム及びその方法 | |
CN111913739B (zh) | 一种服务接口原语定义方法和系统 | |
Nichols et al. | Syntax-based improvements to plagiarism detectors and their evaluations | |
CN114817298A (zh) | 字段级数据血缘提取方法、装置、设备及存储介质 | |
CN112379917A (zh) | 浏览器兼容性提升方法、装置、设备及存储介质 | |
CN116149669B (zh) | 一种基于二进制文件的软件成分分析方法、装置以及介质 | |
US20090234852A1 (en) | Sub-linear approximate string match | |
Juričić | Detecting source code similarity using low-level languages | |
US9208134B2 (en) | Methods and systems for tokenizing multilingual textual documents | |
Slivnik | Context-sensitive parsing for programming languages | |
EA037156B1 (ru) | Способ поиска в тексте совпадений с шаблонами | |
WO2002027486A1 (en) | Methods and apparatus for generating unique identifiers for software components | |
CN117114003A (zh) | 一种基于Trie树的许可证识别方法、系统及介质 | |
CN115599388A (zh) | 一种api接口文档生成方法、存储介质及电子设备 | |
Setoodeh et al. | A proposed model for source code reuse detection in computer programs | |
CN118103815A (zh) | 编译方法以及用于编译的装置 | |
Alabbas et al. | Dependency tree matching with extended tree edit distance with subtrees for textual entailment | |
Hong et al. | FireCite: Lightweight real-time reference string extraction from webpages | |
US6959434B2 (en) | Method of determining the syntactic correctness of expressions | |
CN113408250B (zh) | 一种项目文件的处理方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |