依据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)

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

图中展示的论文分类表示,该论文可以被分到多个类中,这种情况我们需要把它所属的类都统计下来,因此在匹配的时候选择的函数是re.findall()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
  • 两篇论文的分类属性字符串不同
    • 两篇论文分类属性长度lll相同(字符串长度)

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

    依据CCS分类建树(方案一) CCS分类 ACM Computing Classification System(CCS) 2012 ACM计算分类系统已开发为一种多层次的本体,可以在语义Web应用程 ...

  2. 从HTML文件中抽取正文的简单方案

    2011.04.08 更新:想找此方案的代码的朋友请访问:http://code.google.com/p/creamer 从HTML文件中抽取正文的简单方案 作者:alexjc 译者:恋花蝶(htt ...

  3. 毫米波雷达分类和技术方案

    毫米波雷达分类和技术方案 一.什么是毫米波? 毫米波是一项可用于检测物体并提供物体的距离.速度和角度信息的传感技术.这是一项非接触式技术,工作频谱范围为 30GHz 至 300GHz.由于该技术使用较 ...

  4. 构建一个分布式操作系统的简单方案—答陈硕的“分布式系统中的进程标识”一文...

    对分布式系统中的进程标识"一文的疑问 刚才看到陈硕先生的一篇blog:"分布式系统中的进程标识",地址:http://www.cnblogs.com/Solstice/a ...

  5. python分类算法的应用_Python基于sklearn库的分类算法简单应用示例

    Python基于sklearn库的分类算法简单应用示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python基于sklearn库的分类算法简单应用示例.tx ...

  6. python分类算法的应用_Python使用sklearn库实现的各种分类算法简单应用小结

    本文实例讲述了Python使用sklearn库实现的各种分类算法简单应用.分享给大家供大家参考,具体如下: KNN from sklearn.neighbors import KNeighborsCl ...

  7. java扫描局域网中可用ip_使用java线程扫描局域网ip简单方案

    package com.cjh.thread; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...

  8. 子进程及时知道父进程已经退出的最简单方案

    [精彩] 子进程及时知道父进程已经退出的最简单方案? http://www.chinaunix.net 作者:yuonunix  发表于:2003-10-31 10:14:14 [发表评论] [查看原 ...

  9. Ubuntu和Windows双系统服务器互相切换的简单方案

    Ubuntu和Windows双系统服务器互相切换的简单方案 适用场景 解决方案 适用场景 服务器或者远端主机上装了Windows和Ubuntu双系统,但并没有联网BIOS条件.如何在事先进入了某个系统 ...

  10. BOOTMGR is missing 简单方案

    BOOTMGR is missing 简单方案 背景 尝试方法 简单思路和方法 背景 电脑有一天突然显示BOOTMGR is missing,然后按照提示重启也还是显示BOOTMGR is missi ...

最新文章

  1. C#把某个数组的一部分复制到另一个数组中的两种方法:Buffer.BlockCopy和Array.Copy...
  2. 点标记 高德地图_打尽渣男渣女的查岗神器?高德家人地图实测
  3. Maven 进行多环境配置,使用profile文件进行配置
  4. 时序数据合并场景加速分析和实现 - 复合索引,窗口分组查询加速,变态递归加速...
  5. 在windows的某个文件夹下运行WSL中的docker容器
  6. 新东方年会吐槽视频《释放自我2.0》又来了!不过这次俞敏洪没说发奖金...
  7. 在Java中的foreach循环中调用remove
  8. Linux篇---Grep和正则匹配
  9. Atitit 知识点的体系化 框架与方法 如何了解 看待xxx
  10. dubbo 支持服务降级吗_Dubbo服务降级设置
  11. Java集合详解(超详细)
  12. 驱动人生安装驱动计算机无法启动,驱动人生解决声卡驱动问题 驱动人生针对电脑不出声解决方案...
  13. lenovo G480 安装无线驱动 linux
  14. 在线rar压缩包解密软件,忘记rar压缩包密码如何找回?
  15. 王垠:完全用Linux工作
  16. 关于S参数的一些理解
  17. oracle lsnrctl命令,oracle lsnrctl
  18. UEFI模式创建Grub2引导ubuntu16.04和windows10,并安装Linux Nvidia驱动
  19. 邮政局计算寄往美国的国际物品快递资费
  20. ansys【经典】——查看应力应变分布

热门文章

  1. 一个项目经理成长的心路历程,是谁在孤独的夜里抹眼泪
  2. 索尼中兴,平井封神?(转)
  3. 阿里云封禁端口25,导致smtp.126.com邮件无法发送-解决方案+springboot配置
  4. 李阳疯狂英语学习方法大全集-英语,单词
  5. cad的php文件怎么用,CAD无法弹出打开、保存等窗口,用FILEDIA解决
  6. PYS60版短信搜索程序
  7. 940mx黑苹果驱动_【必看】黑苹果安装显卡支持列表
  8. pyltp的基本用法和语义角色标注
  9. 下行法求最小割集案例_最小割集求法.docx
  10. Java练习题_通过2月天数来判断平年闰年