依据CCS分类建树(方案一)

CCS分类

ACM Computing Classification System(CCS)
2012 ACM计算分类系统已开发为一种多层次的本体,可以在语义Web应用程序中使用。它替代了1998年的ACM计算分类系统(CCS)的传统版本,该版本已成为计算领域的事实上的标准分类系统。
它已集成到ACM数字图书馆的搜索功能和可视主题显示中。它依赖于语义词汇作为类别和概念的唯一来源,它反映了计算机科学的最新水平,并且随着未来的发展而接受结构性变化。 ACM在可视显示格式内提供了一种工具,以促进将2012 CCS类别应用到即将发表的论文中,并提供确保CCS与时俱进的过程。新的分类系统将在ACM数字图书馆的人员搜索界面的开发中起到关键作用,以补充其当前的传统书目搜索。
完整的CCS分类树可以HTML格式免费用于教育和研究目的。在ACM数字图书馆中,CCS以可视化显示格式显示,有助于导航和反馈。完整的CCS分类树也可以在数字图书馆中以平面文件形式查看。

来源:https://dl.acm.org/ccs

即,CCS分类是一种树结构的分类标准。接下来看一下给出的CCS分类文件:

由这个文件可以很显然的看出每篇论文的所属的类别。
例如:

  • h. information systems h.3 information storage and retrieval h.3.3 information search and retrieval subjects: search process
  • H.信息系统 h.3信息存储和检索 h.3.3信息搜索和检索主题:搜索过程
    由此可见,该文件属于h.3.3类。

文件的每一行对应一个类,空行是空数据,作特殊处理。
在查询的过程中也发现了中国标准文献分类法(CCS),在这里也可以记录一下。

建树求距离

方案一:借助文件求

观察文件IndexTerms.txt,我们可以知道一篇论文可能会有三种情况:

  • 论文属于a(假设)
  • 论文属于a.1
  • 论文属于a.1.1
    (以后都以a,a.1,a.1.1为例)

因此,树结构最多有三层。那么,我们可以通过分类讨论列举所有情况并进行处理的方式来解决这个问题。

数据预处理

对于文件IndexTerms.txt来说,我们需要的是能够表达论文所属类型的关键词(a,a.1,a.1.1等),而不需要冗长的介绍,因此我们需要对文件进行预处理。
对于这种,我们选择提取k.3.1

但是并不是每个论文都能精确的分类到第三级,因此会有:

这种情况出现,对于这样的我们选择提取j.5。
而有的论文只能划分到大类,例如

对于这种情况,我们选择提取a。

对于这种提取我们有一个很好用的工具:正则表达式。能想到这个问题就很简单了,代码如下

s=""
for i in range(len(lis)):if(len(lis[i])==0):#print(i)s+=str(i)s+=','s+='\n'else:s+=str(i)s+=','ret = re.findall(r'\w.\d.\d',lis[i])if(len(ret)==0):print(i)ret = re.findall(r'\w.\d',lis[i])if(len(ret)==0):ret = re.findall(r'\w',lis[i])s+=ret[0]else:s+=ret[0]else:for j in range(len(ret)):s+=ret[j]if(j<len(ret)-1):s+=","s+='\n'print(s)

需要注意的是,还有一种特殊情况需要单独考虑:

图中展示的论文分类表示,该论文可以被分到多个类中,这种情况我们需要把它所属的类都统计下来,因此在匹配的时候选择的函数是 r e . f i n d a l l ( ) re.findall() re.findall()

为了方便之后的计算,我们把处理后的数据存到一个文件中。存储的形式为“论文id,分类”,因此在构造字符串的时候也进行了相应的处理。写入文件:

fh = open('E:\\创新实训\\资料整理\\code+data\\treenode.txt', 'w', encoding='utf-8')
fh.write(s)
fh.close()

文件如下:

计算距离

因为树的结构是规则的,因此距离也是有规律可循的,接下来我们对每种情况进行分类讨论。
假设论文为X和Y,并且,我们把 “* . * . *” 部分记为该论文的分类属性。

  • 其中有论文没有所属类:

    • 相似度为0
  • 两篇论文不属于同一个大类:
    • 相似度为0(该相似度仍有待商榷)
  • 两篇论文的分类属性字符串完全相同
    • 相似度为1
  • 两篇论文的分类属性字符串不同
    • 两篇论文分类属性长度 l l l相同(字符串长度)

      • l = = 3 l==3 l==3:同为二级节点,没有多种情况,边数为2,设边权为2(*),相似度记为距离的倒数,因此相似度为1/4。
      • l = = 5 l==5 l==5:
        • 两篇论文属于同一个二级结点:边数为2,距离为4,相似度为1/4。
        • 两篇论文不同属于一个二级结点,那么它们的最近公共父节点就是根节点,因此边数为4,距离为8,相似度为1/8.
      • 注: l ! = 1 l!=1 l!=1,因为当属性分类字符串长度为1时,说明是“a”这种情况,这种情况已经由上一步的“分类属性字符串完全相同”处理了,因此这里没有。
    • 两篇论文分类属性长度 l l l不同(字符串长度)
      • 声明: 我们保证 l x < l y l_x<l_y lx​<ly​,如正好相反,则交换 x , y x,y x,y。
      • l x = = 1 l_x==1 lx​==1 and l y = = 3 l_y==3 ly​==3:边长为1,距离为2,相似度为1/2。
      • l x = = 1 l_x==1 lx​==1 and l y = = 5 l_y==5 ly​==5:边长为2,距离为4,相似度为1/4。
      • l x = = 3 l_x==3 lx​==3 and l y = = 5 l_y==5 ly​==5:
        • 两篇论文是父子关系: 边长为1,距离为2,相似度为1/2。
        • 两篇论文不是父子关系:边长为3,距离为6,相似度为1/6。

至此,所以的情况我们已经都讨论完了,只要按照这个编写代码即可完成。

def fun():X,Y=input().split()X=int(X)Y=int(Y)##ID itx=listid[X].split(",")ty=listid[Y].split(",")if(tx[1]==ty[1]):return 1XT=tx[1][0]YT=ty[1][0]#print(XT,YT)if(XT!=YT):return 0##直接返回相似度,不是距离,距离算无穷大else :lx=len(tx[1])ly=len(ty[1])if(lx>ly):##保证lx<lytt=lxlx=lyly=tttt=txtx=tyty=tt##数值和字符串都换回来if(lx==ly):if(lx==1):return 1/1elif(lx==3):return 1/4else:#print(lx)xx=tx[1]yy=ty[1]mx=xx.split(".")[1]my=yy.split(".")[1]##找出第二位if(mx==my):return 1/4else:return 1/8else:##lx<lyif(lx==1)&(ly==3):return 1/2elif(lx==1)&(ly==5):return 1/4else:xx=tx[1]yy=ty[1]mx=xx.split(".")[1]my=yy.split(".")[1]##找出第二位if(mx==my):return 1/4else:return 1/6

调用该函数,输入需要计算的论文id,即可得到结果。

全部代码如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Jun 23 10:33:22 2020@author: nyy
"""
#import re
def Load():listid = []for line in open("treenode.txt","r"): #设置文件对象并读取每一行文件listid.append(line.replace("\n","")) #print(listid)return listiddef fun(listid):print("请输入论文id:")X,Y=input().split()X=int(X)Y=int(Y)##ID itx=listid[X].split(",")ty=listid[Y].split(",")if(len(tx[1])==0) or (len(ty[1])==0):return 0if(tx[1]==ty[1]):return 1XT=tx[1][0]YT=ty[1][0]#print(XT,YT)if(XT!=YT):return 0##直接返回相似度,不是距离,距离算无穷大else :lx=len(tx[1])ly=len(ty[1])if(lx>ly):##保证lx<lytt=lxlx=lyly=tttt=txtx=tyty=tt##数值和字符串都换回来if(lx==ly):if(lx==1):return 1/1elif(lx==3):return 1/4else:#print(lx)xx=tx[1]yy=ty[1]mx=xx.split(".")[1]my=yy.split(".")[1]##找出第二位if(mx==my):return 1/4else:return 1/8else:##lx<lyif(lx==1)&(ly==3):return 1/2elif(lx==1)&(ly==5):return 1/4else:xx=tx[1]yy=ty[1]mx=xx.split(".")[1]my=yy.split(".")[1]##找出第二位if(mx==my):return 1/4else:return 1/6def main():lis=Load()#print(lis)rere=fun(lis)print(rere)main()

依据CCS分类建树(方案一)相关推荐

  1. 地形因子分类整合方案

    1. 根据描述尺度范围的地形因子分类整合方案 微观:描述一个微分点单元的信息,其量值大小一般只受它所在点的点位高程及微小邻域范围内高程信息的影响.微观地形因子具有空间矢量特征.基于DEM的微观地形因子 ...

  2. Logback 日志过滤器的使用-日志分类归档方案

    文章目录 前言 1. Logback 过滤器的分类 2. 常规过滤器 2.1 日志级别过滤器 LevelFilter 2.2 日志评估过滤器 EvaluatorFilter JaninoEventEv ...

  3. 基于深度学习的小样本分类识别方案总结

    文章目录 1. 方案一 1.1 算法方案解析 1.1.1 赛题理解 1.1.2 模型选择:尽量使用与数据匹配的SOTA模型 1.1.3 TIM模型介绍 1.1.4 TIM模型-训练 1.1.5 TIM ...

  4. 2020CCFBDCI通用音频分类CNN方案(0.90+方案)

    通用音频分类 赛题介绍 数据简介 import的包 音频文件读取 特征构造 CNN多分类 提取预测结果并写入csv文件 改进方向 参考文献 数据链接 博主继续入门了音频分类问题,根据上一个baseli ...

  5. 小米笔试题 依据父子关系建树

    问题描述: 现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度  输入描述:  输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n- ...

  6. 推特文本情感多分类高分方案

    每天给你送来NLP技术干货! 作者:刘健健 来自:ChallengeHub 一.推特文本情感分类赛题简介 练习赛地址:https://www.heywhale.com/home/activity/de ...

  7. 天池零基础入门NLP - 新闻文本分类Top1方案的bert4torch复现

    天池有些长期比赛可以练习玩玩(还可以继续提交),于是试了下简单的新闻文本分类任务,Top1的解决方案思路是"预训练+fgm+交叉验证模型融合",代码是基于bert4keras的,本 ...

  8. 对COVID-19论文进行自动分类——文献聚合分类实现方案

    概述 实现步骤: 使用自然语言处理(NLP)从每个文档的正文中解析文本. 使用术语频率-逆文档频率(TF-IDF)将每个文档实例

  9. 如何 添加 implementation_如何用序列分类方式进行法律要素与当事人关联性分析 | 机器之心...

    在智慧司法领域中,针对法律裁判文书的分析和挖掘已经成为计算法学的研究热点.目前公开的裁判文书资料大都以长篇文本的形式出现,内容主要包含案号.当事人.案由.审理过程.裁判结果.判决依据等,篇幅较长.表述 ...

最新文章

  1. Java中元组的使用
  2. 计算机书籍-机器学习预测分析
  3. 升级CommunityServer2.0出现的两个问题的解决方法
  4. 水晶报表主子报表分页问题
  5. shiro与springMVC整合
  6. Together与Visual.Studio.NET的结合使用(三)
  7. Maven学习总结(58)—— 常用的 Maven 镜像地址和中央仓库地址汇总
  8. 边缘检测算法_机器视觉怎样检测产品边缘
  9. 对比AppScan Source和Fortify扫描AltoroJ的结果
  10. config配置文件
  11. android与rn混合开发,RN 混合开发项目调用安卓原生解决方案
  12. EPC901安装XP
  13. ios模拟器 安装ipa_用iOS模拟器安装App的方法
  14. 【Unity 自学之路】2 - 素材编辑
  15. rpm包的卸载与安装
  16. [PHP] 新浪企业邮箱登录功能难点梳理
  17. 大学学python用记笔记吗_python笔记(1)-关于我们应不应该继续学习
  18. 什么是NVMe硬盘?
  19. redis压测工具redis-benchmark
  20. 图像渲染测试软件,Arnold渲染器之aiImage(ai图像)着色器介绍及渲染测试

热门文章

  1. oracle 中的 CONCAT,substring ,MINUS 用法
  2. 2020 年 TensorFlow 开发者峰会总结
  3. 有红、白、黑三种球若干个,求红白黑球的数量
  4. RockChip MPP编码
  5. 基于微信小程序宠物交易小程序——计算机毕业设计
  6. vulnhub Gigachad 靶场练习
  7. 解密:Jersey 入门指南系列1
  8. 圆圆的球像什么_关于圆圆的月亮像什么的句子有哪些?
  9. 建筑八大员培训湖北劳务员培训我国与德国的建筑劳务派遣对比
  10. Android 图形之 Surface 和 SurfaceHolder