blog新地址 Surprised => indulgence => Calm => Lost => Panic =>Calm

完成超大文本到数据库的录入和文章被引用数的图形绘制

后端库 admin 2512℃ 0评论

获取到原始数据,并分析这个数据的特征

示例文本如下:

#* — 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逐行读取文本,

当读取到这一行只有一个换行符时,就将读取到的数据库存入数据库。

注意:

  1. 这个的 #% 这类型的属性在某一段文本中也可能是具有多个的,所以就需要进行判断。
  2. 原始数据是一段一段的,也就是数据库中的一条条记录
  3.  #% 这个字段有多个值,我们用英文逗号“,”将多个值分开
  4. 完成这部分读取工作可以完成对文本到数据库的录入工作

向数据库中添加字段-引用次数和被引用次数

  • 引用次数

引用次数就是上面所提到的,可能在某一段文本中出现多个的字段。

这个字段表示该ID号的文章引用其他文章的ID。

该文章的引用次数(我们称之为:ref_count),这个比较方便统计:

只需要在程序逐行读取某一段文本的时候,将这个字段(#%)出现的次数统计出来就可以了。

  • 被引用次数

被引用次数是指,某文章的ID,出现在整个数据库中字段(#%)的次数(我们称之为:refed_count)

如果是在完成“从文本到数据库”的录入之后,读取一条数据录,

然后遍历整个数据库,找出其ID出现的次数,这样回做(n×n)运算。

为了更高效的得出完成数据库录入,采用如下办法:

1.在录入数据库的过程中就将所有的(#%)字段中内容提取出来,

2.单独放在一个文本中,使用英文逗号分隔

3.过程2得到了一个被引用的id的集合,统计这个集合中各个元素出现的次数

4.过程3得到一个字典列表:“ID号:次数(也就是被引用次数)”

5.把这个字典更新数据库就可以了

注意:

  1. 在过程4中统计这个集合中元素的次数,使用的是python的collections库中的Counter类
  2. 使用的代码如下:
  3. 代码
    f = open("refset.txt","r")
    line = f.readline()
    line = line.split(",")
    elementCounter = Counter(line)
    dictCounter = dict(elementCounter)
    dictNum = len(dictCounter)
    
  4. 也就是将引用的文章ID的集合读取出来,按照英文逗号得到列表
  5. 再用Counter类获取到到一个Counter类型的字典存放在elementCounter中
  6. 在用dict()将其转换成字典,再获取字典的长度和键值

详情参考:

collections模块的Counter类

建立文档-文章 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()

 

 

 

 

 

转载请注明:Imekaku-Blog » 完成超大文本到数据库的录入和文章被引用数的图形绘制

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址