除了文献内容的文本特征外,文献之间的引文关系也是判断它们之间相似度的重要依据。
观察WOS中下载数据中的CR字段,是每篇文献的参考文献情况:
从图中可以看出,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!')
结果如图:
引文网络的构建是基于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篇真的要了老命了。
反思一下觉得自己写代码都是很基础的,效率必然也是低下的,可能我们专业基本没有在钻研算法这些?只想把问题解决了就好了。
引文网络也差不多建好了(虽然有些小细节的问题但暂时不想再看了),继续捣鼓我的拓扑特征去了~
就酱~