python:文献引文网络构建——基于web of science

除了文献内容的文本特征外,文献之间的引文关系也是判断它们之间相似度的重要依据。
观察WOS中下载数据中的CR字段,是每篇文献的参考文献情况:
python:文献引文网络构建——基于web of science_第1张图片
从图中可以看出,WOS是通过文献的DOI来标注参考文献的,所以要知道文献之间的引用情况必须要把每篇文献引用的DOI集提取出来:

def DOISET(raw,export_url,num):
    re_out=open(export_url,'a')
    DOIset1=[]
    DOIset2=[]
    raw=raw.strip()
    line=[]
    line=raw.split('; ')
    for words in line:
        word=words.split(', ')
        for i in word:
            if 'DOI' in i:
                DOIset1.append(i)
            else:
                continue
    for DOI in DOIset1:
        DOIset2.append(DOI.replace('DOI ', ''))
    out_str=','.join(DOIset2)
    re_out.write(str(num)+'\t')
    re_out.write(out_str)
    re_out.write('\n')
    re_out.close()
  

 import mysql.connector
 def connect_mysql():
    conn=mysql.connector.connect(host='localhost', user='root', passwd='数据库密码', db='数据库名称', charset='utf8')
    cursor=conn.cursor()
    cursor.execute('select CR from test1.cris order by UT')
    rows=cursor.fetchall()
    i=0
    for row in rows:
        i+=1
        DOISET(row[0], '写入文档的名称',i)
    conn.close()

connect_mysql()
print('finish!')

结果如图:
python:文献引文网络构建——基于web of science_第2张图片

引文网络的构建是基于AMSLER网络原理,同时考虑文献之间的共被引情况和耦合情况,只要文献之间存在共被引或耦合情况,两篇文献间的引用情况就+1,依照这个理论构建引文网络。
我的想法是:
1.共被引数:每篇文献的DOI两两匹配,如果都在数据库中,则引用数+1
2.耦合数:任意两篇文献引用DOI集进行匹配,有相同的一项两篇文献的引用数+1
3.目前暂时通过字典的方式来存储矩阵{1:{2:[citationnum]}}

代码如下:

import mysql.connector
class compute_citation:
    def esCRset(self,filepath):            
    #从刚才的提取出的引用DOI集提取出来,存储在列表中
        data_source=open(filepath,'r')
        data=data_source.readline()
        i=0
        datatemp=[]
        datatemp.append([])
        while(data!=""):
            i+=1
            datatemp_1=[]
            datatemp_2=[]
            datatemp_1=data.strip('\n').split("\t")
            datatemp_2=datatemp_1[1].split(",")
            datatemp.append(datatemp_2)
            data=data_source.readline()
        data_source.close()
        return datatemp

    def esDOIset(self):
    #提取出每篇文献的DOI存储在列表中
        datatemp={}
        conn=mysql.connector.connect(host='localhost', user='root', passwd='数据库密码', db='test1', charset='utf8')
        cursor=conn.cursor()
        cursor.execute('select DI from test1.cris order by UT')
        rows=cursor.fetchall()
        i=0
        for row in rows:
            i+=1
            if row[0]=='':
                continue
            else:
                datatemp[row[0]]=i
        conn.close()
        return datatemp

    def compute_bibli(self,filepath):
    #文献耦合数计算
        CRset=self.esCRset(filepath)
        net={}
        for i in range(1,20479):
            net[i]={}
            list1=CRset[i]
            t=i+1
            if list1==['']:
                while(t<=20478):
                    net[i][t]=0
                    t+=1
            else:
                while(t<=20478):
                    num=0
                    list2=CRset[t]
                    if list2==['']:
                        net[i][t]=0
                        t+=1
                    else:
                        for x in list1: 
                            if x in list2:                            
                                num+=1
                            else:
                                continue
                        net[i][t]=num
                        t+=1
        return net
    def compute_add(self,filepath):
    #文献共被引数计算
        DOIset=self.esDOIset()
        CRset=self.esCRset(filepath)
        net=self.compute_bibli(filepath)
        for CR in CRset:
            if CR==[''] or CR==[]:continue
            listok=[]
            for i in CR:
                if i in DOIset:
                    listok.append(DOIset[i])
            if len(listok)!=0:
                length=len(listok)
                listok.sort()
                for i in range(0,length-1):
                    p=i+1
                    while(p<length):
                        if listok[i]<listok[p]:net[listok[i]][listok[p]]+=1
                        else:net[listok[p]][listok[i]]+=1
                        p+=1
                        
compute=compute_citation()
dicx=compute.compute_add('C:/users/49509/desktop/citation.txt'

PS:耦合数计算那里比较慢,我1w篇大概运行了半个多小时,所以前期筛选文献很重要啊,做这种计量分析我觉得七八千就差不多了,2w篇真的要了老命了。
反思一下觉得自己写代码都是很基础的,效率必然也是低下的,可能我们专业基本没有在钻研算法这些?只想把问题解决了就好了。
引文网络也差不多建好了(虽然有些小细节的问题但暂时不想再看了),继续捣鼓我的拓扑特征去了~
就酱~

你可能感兴趣的:(科研训练)