基于DBLP的作者协作关系的挖掘

  DBLP是计算机领域内对研究的成果以作者为核心的一个计算机类英文文献的集成数据库系统。按年代列出了作者的科研成果。包括国际期刊和会议等公开发表的论文。和一般流行的情况不同,DBLP并没有使用数据库而是使用XML储存元数据。

  采用将xml文件转化为weka可以识别的CSV文件的形式进行处理。

  在关系挖掘中我们组选用了Apriori算法。Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。该算法已经被广泛的应用到商业、网络安全等各个领域。也可采用FP-Growth算法,可能效果会更好,此处暂不涉及。

  步骤一:数据预处理

  DBLP的xml文件现在已经有1.2G之大。经过测试只有用VI和写字板才可以打开(电脑6G内存为例)。根本不能照常规方式处理,csv和arff格式都是weka支持的格式,但是经实验发现weka处理csv的速度好像更快,具体不知道什么原因,所以采用转化成csv的形式。

  自己编写Parser,用于读取dblp.xml信息。由于我们只关注作者的协作关系信息,所以xml数据做以下处理:

  1:文章名字不予考虑  

  2:只有单个作者的条目直接删除

  3:作者发表文章篇数在80篇以下的删除

    可以自己考虑,但为了挖掘出强支持支持度和置信度的数据,取80。删除时需要建立一个map映射统计作者数目,增加处理速度。

    此步骤实际和apriori算法的第一步类似。每一篇文章只提取前8个作者,处理后得到大约20多万条数据。

  4:每本书至多保留8个作者

  5:由于weka中将" '  "等符号认为是特殊符号,所以在作者名字中遇到此类名字,将特殊符号删除,并不会造成大的影响。  

  

  保存为data80.csv,该程序处理了全部的370多万条数据,从中截取了有价值的部分信息交由weka进行进一步的分析处理。

package preprocess;

public class Author_num {
    private String name;
    private int count;
    Author_num()
    {
        
    }
    Author_num(String aname,int acount)
    {
        name = aname;
        count = acount;
    }
    public void setname(String aname)
    {
        name = aname;
    }
    public void setcount(int acount)
    {
        count = acount;
    }
    public void addcount()
    {
        count++;
    }
    String getname()
    {
        return name;
    }
    int getcount()
    {
        return count;
    }
}
Auther_Num

 

package preprocess;
import com.csvreader.CsvWriter;

import java.util.List;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.*;
import static java.lang.Math.*;

public class Readxml{
    private int Maxattribute = 8;         //考虑的最大作者数
    private int Maxnum = 100000000;       //读取文件长度,xml行
    private int booknum = 0;              //记录当前已读的书本数目
    private Map<String,Integer> map=new HashMap<String,Integer>();   //记录作者出现的次数
    public void run()
    {
        System.out.println("reading...");
        String line = "";
        String Temp = "";
        File filer = new File("D:\\dblp.xml");
        //CsvWriter wr =new CsvWriter("D:\\writetestall90.csv",',',Charset.forName("SJIS")); 
        int numofauthor=0;//管理作者数量
        int thisnum=0;    //记录实际作者数量
        try
        {
            BufferedReader br = new BufferedReader(new FileReader(filer));         
            String[] contents = new String [Maxattribute];   
            //生成map映射记录所有作者和作者出版的书本数目
            while(((line = br.readLine()) != null))
            {
                if( (line.length()>8) && line.substring(0,8).equals("<author>"))
                {
                    Temp = line.substring(8, (line.length()-9));
                    //清理数据中 出现的'和"
                    while(Temp.indexOf("'") >= 0)
                    {
                        Temp = Temp.substring(0,Temp.indexOf("'"))+Temp.substring(Temp.indexOf("'")+1);           
                    }
                    while(Temp.indexOf("\"")>=0)
                    {       
                        Temp = Temp.substring(0,Temp.indexOf("\""))+Temp.substring(Temp.indexOf("\"")+1); 
                    }
                    if(map.get(Temp)==null)
                    {
                        map.put(Temp, 1);
                    }
                    else
                    {
                        map.put(Temp,map.get(Temp)+1);
                    }
                }
                else if((line.length()>7) && line.substring(0, 7).equals("<title>"))
                {
                  
                    booknum++;       
                    System.out.println("已读书本数"+booknum);
                   
                } 
            } 
     
            
            Set<String> keys = map.keySet();
            Iterator<String> it = keys.iterator();
            int count = 0;
            while(it.hasNext()) {
                String key = it.next();
                
                if(map.get(key)>80)
                {
                    System.out.println(key + "-->" + map.get(key));
                    count++;
                }
                
                
            }
            System.out.println("shuliang:"+count);

            
            br.close();
            /*
            BufferedReader br1 = new BufferedReader(new FileReader(filer));
            for(int i = 1;i<=Maxattribute;i++)
            {
                contents[i-1] = "author"+i;  
            }
            wr.writeRecord(contents);        
            while(((line = br1.readLine()) != null)&&(Maxnum-->0))
            {              
                if( (line.length()>8) && line.substring(0,8).equals("<author>"))
                {
                    //每本书只考虑至多8个作者
                    if(numofauthor<Maxattribute)
                    {
                        Temp = line.substring(8, (line.length()-9));
                        while(Temp.indexOf("'") >= 0)
                        {
                            Temp = Temp.substring(0,Temp.indexOf("'"))+Temp.substring(Temp.indexOf("'")+1);           
                        }
                        while(Temp.indexOf("\"")>=0)
                        {       
                            Temp = Temp.substring(0,Temp.indexOf("\""))+Temp.substring(Temp.indexOf("\"")+1); 
                        }
                        //值保留出现次数大于80的作者
                        if(map.get(Temp)>80)
                        {
                            contents[numofauthor++]="'"+Temp+"'";    
                        }
                    }        
                }
                else if((line.length()>7) && line.substring(0, 7).equals("<title>"))
                {
                    thisnum = numofauthor;
                    while(numofauthor<Maxattribute)
                    {
                        contents[numofauthor++]="?"; 
                    }      
                    Temp = line.substring(7, (line.length()-8));   
                    //删除只有一个作者的书本记录
                    if(thisnum>1)
                    {
                        wr.writeRecord(contents); 
                    }             
                    numofauthor = 0;
                    thisnum = 0;
                }       
            }   
            */     
            System.out.println("parseover!");    
            //br1.close();
            //wr.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }   
    }
}
readxml

 

  步骤二:使用weka中Apriori算法挖掘关联规则

1.最小支持度下界为0.00005(约100),conf为0.9 。

    由上图可得出结论:214082篇文章中挖掘出10条规则,这些作者有着深层次的合作。

 

2:最小支持度为0.000025(约50),conf为0.8。

由上图可知,在降低最小置信度,并减小conf值时,增加了得到的规则。(10条增加到257条。)

 

 

 

转载于:https://www.cnblogs.com/binpan/p/3407598.html

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于关联规则挖掘DBLP学者关系python源码+实验报告(数据挖掘作业).zip 基本思路 解析 DBLP 的 xml 文件,以 attention 和 transformer 为关键词,只取 2017 年以后的文章。 把人名编码成数字。 一年一年来处理,认为有效的学者关系满足两点: 一年内发表论文数量大于 5【支持率】。 关系内任意一人记为 a,除他之外其他人记为 A,要满足 A → A+a 的【置信率】大于 0.5;注意是任意一人。 定义 人数=2 的关系为【合著者】,人数>2 的关系为【团队】。 定义学者关系的【活跃程度】:α \* 这一堆人发表文章数量 + β / 人数 \* 求和{一堆人发表文章数量 / 每个人发表文章数量}。取 α=1,β=10。注意发表数量都是一年内的。 主要结论 研究 attention transformer 的人越来越多。 貌似没人能一直研究 attention transformer 超过一年,大家的研究方向变得很快。 好多活跃的人都是重复的,比如出现 “一个固定导师+一个可变学生” “两个固定导师+一个可变学生” “AB BC AC 都活跃” 这种 pattern,三五好友 / 整个实验室一起研究 transformer。 合著者发文数量上,2018年有一个激增;团队发文数量上,2019年和2021年都有激增。 文件列表 py: `getAuthors.py`:从 DBLP 的 xml 文件,解析得到 `authors.txt`。 `encodeAuthors.py`:把 `authors.txt` 编码成 `authors_encode.txt` + `author_index.txt`。 `fpgrowth.py`:调用 `mlxtend` 的关联规则挖掘,以及学者关系分析。 txt: `authors.txt`:年份 + title + 学者名字。 `authors_encode.txt`:年份 + title + 学者编码(数字)。 `author_index.txt`:学者编码 + 学者名字 + 这个人(一年内)总共发表数量。 csv: `result_co_authors_5_0.5.csv`:合著者的分析结果,年份 + 学者名字(tuple)+ 学者一年内发文数量 + 活跃程度。 `result_teams_5_0.5.csv`:团队的分析结果,格式同上。 pdf: 课程报告。 【备注】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载使用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值