获取到原始数据,并分析这个数据的特征
示例文本如下:
#* — paperTitle
#@ — Authors
#t —- Year
#c — publication venue
#index 00—- index id of this paper
#% —- the id of references of this paper (there are multiple lines, with each indicating a reference)
#! — Abstract
也就是在被一行的开头出现这一行的类型的标志,
根据这个标志获取这一行的数据,并放入数据库就可以了。
这个使用的python代码,python逐行读取文本,
当读取到这一行只有一个换行符时,就将读取到的数据库存入数据库。
注意:
- 这个的 #% 这类型的属性在某一段文本中也可能是具有多个的,所以就需要进行判断。
- 原始数据是一段一段的,也就是数据库中的一条条记录
- #% 这个字段有多个值,我们用英文逗号“,”将多个值分开
- 完成这部分读取工作可以完成对文本到数据库的录入工作
向数据库中添加字段-引用次数和被引用次数
- 引用次数
引用次数就是上面所提到的,可能在某一段文本中出现多个的字段。
这个字段表示该ID号的文章引用其他文章的ID。
该文章的引用次数(我们称之为:ref_count),这个比较方便统计:
只需要在程序逐行读取某一段文本的时候,将这个字段(#%)出现的次数统计出来就可以了。
- 被引用次数
被引用次数是指,某文章的ID,出现在整个数据库中字段(#%)的次数(我们称之为:refed_count)
如果是在完成“从文本到数据库”的录入之后,读取一条数据录,
然后遍历整个数据库,找出其ID出现的次数,这样回做(n×n)运算。
为了更高效的得出完成数据库录入,采用如下办法:
1.在录入数据库的过程中就将所有的(#%)字段中内容提取出来,
2.单独放在一个文本中,使用英文逗号分隔
3.过程2得到了一个被引用的id的集合,统计这个集合中各个元素出现的次数
4.过程3得到一个字典列表:“ID号:次数(也就是被引用次数)”
5.把这个字典更新数据库就可以了
注意:
- 在过程4中统计这个集合中元素的次数,使用的是python的collections库中的Counter类
- 使用的代码如下:
- 代码
f = open("refset.txt","r") line = f.readline() line = line.split(",") elementCounter = Counter(line) dictCounter = dict(elementCounter) dictNum = len(dictCounter)
- 也就是将引用的文章ID的集合读取出来,按照英文逗号得到列表
- 再用Counter类获取到到一个Counter类型的字典存放在elementCounter中
- 在用dict()将其转换成字典,再获取字典的长度和键值
详情参考:
[dm href=’http://www.pythoner.com/205.html’]collections模块的Counter类[/dm]
建立文档-文章 ID与被引用文章ID
在录入数据库的过程中,读取到#%字段,即完成以下内容存储:
将该文章ID,被引用ID写入文本,中间用逗号隔开。
每读到一个#%字段就完成这样一次写入。
“绘制被引用次数” 和 “被引用次数的次数” 之间二维坐标图绘制
在得到文章的被引用次数时,我们获取到了一个字典列表,
只需要将这个字典键值对中的值(也就是被引用次数)拿出来,
放在一个文档中,我们就得到了一个文章被引用次数的集合。
同理,
我们可以把这个集合再按照“获取被引用次数”的方法炮制就可以了,
也就是将这个集合统计其中“被引用次数的次数”,再制作成一个字典
那么字典应该为:“被引用次数:被引用次数的次数”
再将这个字典写入文本文档,利用python的matplotlib库,
分别吧字典的键和值当做(x,y)坐标,绘制二维坐标即可。
录入数据库,获取被引用次数,更新数据库(完成被引用次数的添加),
获取被引用次数和被引用次数的次数文档建立,代码如下:
__author__ = 'lee' # -*- coding:UTF-8 -*- # linux mint # cannot run the program on windows import time import sqlite3 from collections import Counter def create_db(dbname): conn = sqlite3.connect(dbname) cursor = conn.cursor() cursor.execute("create table table1(" "id text, " "title text, " "authors text, " "year text, " "conf text, " "citation text, " "index_id unsigned big int primary key, " "pid text, " "ref text, " "ref_count text, " "refed_count text," "abstract text" ")") conn.commit() cursor.close() conn.close() print("datebase created success!") def insert_db(dbname): conn = sqlite3.connect(dbname) cursor = conn.cursor() f = open(r"/home/lee/lab/python/readdata/acm_output.txt", "r") ftxt = open("refedcount.txt","a") # 用于存储引用和被引用的记录 fref = open("refset.txt","a") line = f.readline() # 这一行是读取总共有多少条数据,并不需要 # 初始化 id = 0 title = '' author = '' year = '' conf = '' citation = '' index_id = '' pid = '' ref = '' ref_count = 0 refed_count = 0 abstract = '' while line: line = f.readline() if line[0:2] == "#*": title = line[2:].strip("\n") elif line[0:2] == "#@": author = line[2:].strip("\n") elif line[0:5] == "#year": year = line[5:].strip("\n") elif line[0:5] == "#conf": conf = line[5:].strip("\n") elif line[0:9] == "#citation": citation = line[9:].strip("\n") elif line[0:6] == "#index": index_id = int(line[6:].strip("\n")) elif line[0:8] == "#arnetid": pid = line[8:].strip("\n") elif line[0:2] == "#%": if ref == "": ref = line[2:].strip("\n") ref_count = 1 # 向文本写入引用的条目和被引用的条目 temp_index_id = str(index_id) ftxt.write(temp_index_id) ftxt.write(" ") temp_line = line[2:].strip("\n") ftxt.write(temp_line) ftxt.write("\n") # 向文本中写入被引用id的集合 fref.write(temp_line) fref.write(",") else: ref = ref + "," # id所引用的条目 ref = ref + line[2:].strip("\n") ref_count = ref_count + 1 # 引用的个数 # 向文本中写入引用和被引用 temp_index_id = str(index_id) ftxt.write(temp_index_id) ftxt.write(" ") temp_line = line[2:].strip("\n") ftxt.write(temp_line) ftxt.write("\n") fref.write(temp_line) fref.write(",") elif line[0:2] == "#!": abstract = line[2:].strip("\n") elif line == "\n": id = int(id) + 1 cursor.execute("insert into table1(\ id, title, authors, year, conf, citation, index_id, pid, \ ref, ref_count, refed_count, abstract) values(?,?,?,?,?,?,?,?,?,?,?,?)",\ (id, title, author, year, conf, citation, index_id, pid, ref, ref_count, refed_count, abstract)) title = '' author = '' year = '' conf = '' citation = '' index_id = '' pid = '' ref = '' ref_count = 0 abstract = '' conn.commit() cursor.close() conn.close() ftxt.close() fref.close() print("database inserted success!") # 将refset(其中放置的是被引用的条目)中的被引用的条目的次数更新在数据库中,表明index_id被引用的次数 def update_db(dbname): f = open("refset.txt","r") line = f.readline() line = line.split(",") elementCounter = Counter(line) dictCounter = dict(elementCounter) dictNum = len(dictCounter) conn = sqlite3.connect(dbname) cursor = conn.cursor() for i in range(0, dictNum): cursor.execute("update table1 set refed_count = ? where index_id = ?", (elementCounter[line[i]], int(line[i]))) conn.commit() cursor.close() conn.close() print("database updated success!") # 获取引用的次数之间的关系,详情见邮件 def collected_refed_count(dbname): fr = open("refset.txt", "r") fw_count_set = open("refed_count_set.txt", "w") # 被引用的次数的集合 fr_count_set = open("refed_count_set.txt", "r") fw_count_count = open("refed_count_count.txt", "w") # 被引用的次数 与 被引用次数的次数 line = fr.readline() line = line.split(",") elementCounter = Counter(line) dictCounter = dict(elementCounter) dictNum = len(dictCounter) for i in range(0, dictNum): fw_count_set.write(str(elementCounter[line[i]])) fw_count_set.write(",") line2 = fr_count_set.readline() line2 = line2.split(",") elementCounter2 = Counter(line2) dictCounter2 = dict(elementCounter2) dictNum2 = len(dictCounter2) for i in range(0, dictNum2): fw_count_count.write(str(elementCounter2[line2[i]])) fw_count_count.write(",") fw_count_count.write(str(line2[i])) fw_count_count.write("\n") fw_count_set.close() fw_count_count.close() if __name__ == '__main__': start = time.clock() dbname = "addrefcount.db" # create_db(dbname) # insert_db(dbname) # update_db(dbname) collected_refed_count(dbname) end = time.clock() print("the program took time: ") print(end-start)
绘制二维坐标系代码如下:
import matplotlib.pyplot as plt f = open("refed_count_count.txt", "r") line = f.readline() while line: line = line.split(",") x = line[0] y = line[1] plt.figure(1) plt.plot(x, y, "r.") line = f.readline() plt.ylabel("refed_count_count") plt.xlabel("refed_count") plt.show()