提取mongodb中论文的信息,填入mysql,加快统计速度

1.创建mysql的alzheimer表,包括pmc_id,journal,title,abstract,name,authorinfor,pun_year,keyword,reference信息。

#encoding = utf-8
import pymysql
import json

def input_from_json(filename):
    with open(filename,‘r‘) as file:
        data = json.loads(file.read())
        return data
conn= pymysql.connect(
        host=‘localhost‘,
        port = 3306,
        user=‘root‘,
        passwd=‘‘,
        db=‘python‘
        )
cur = conn.cursor()

def createdb():
    cur.execute(‘create table alzheimer(id int AUTO_INCREMENT,PRIMARY KEY (id))‘)
    cur.execute(‘alter table alzheimer add pmc_id int‘)
    cur.execute(‘alter table alzheimer add journal text‘)
    cur.execute(‘alter table alzheimer add title text‘)
    cur.execute(‘alter table alzheimer add abstract text‘)
    cur.execute(‘alter table alzheimer add namestr text‘)
    cur.execute(‘alter table alzheimer add authorinfor text‘)
    cur.execute(‘alter table alzheimer add pub_year varchar(5)‘)
    cur.execute(‘alter table alzheimer add union_kwd_str text‘)
    cur.execute(‘alter table alzheimer add reference_str text‘)

createdb()

#up is all the test
def addnewcloumn():
    cur.execute(‘alter table test add transactor varchar(10)‘)
    cur.execute(‘alter table ad add hasid varchar(10)‘)

def addtomysql():
    idlist = input_from_json(‘id_list.json‘)[‘idList‘]
    values = []
    for i in range(len(idlist)):
        values.append((i,idlist[i]))

    cur.executemany(‘insert into ad  values(%s,%s)‘,values)

def updatenewcol():
    idlist = input_from_json(‘id_list.json‘)[‘idList‘]
    values = []
    for i in range(len(idlist)):
        values.append((‘yes‘,i))
    cur.executemany(‘update ad set hasid = (%s) where id = (%s)‘,values)

def selectpmcid():
    sql = "SELECT pmc_id FROM ad "
    a = cur.execute(sql)
    print a
    b = cur.fetchmany(a)  #b has 7887 abstract list

    print b[0][0],b[2][0]
    print type(b[0][0])   #int

def addnewcolunm():
    cur.execute(‘alter table ad add journal text‘)
    cur.execute(‘alter table ad add title text‘)
    cur.execute(‘alter table ad add abstract text‘)
    cur.execute(‘alter table ad add namestr text‘)
    cur.execute(‘alter table ad add authorinfor text‘)
    cur.execute(‘alter table ad add pub_year varchar(5)‘)
    cur.execute(‘alter table ad add union_kwd_str text‘)
    cur.execute(‘alter table ad add reference_str text‘)

def inserttest():
    cur.execute(‘create table test2(id int AUTO_INCREMENT,PRIMARY KEY (id))‘)
    cur.execute(‘alter table test2 add pmc_id int‘)
    cur.execute(‘alter table test2 add title text‘)
def inserttest2():
    values = []
    for i in range(10):
        values.append((i,‘hello‘+str(i)))
    cur.executemany(‘insert into test2(pmc_id,title) values(%s,%s)‘,values)

conn.commit()
cur.close()
conn.close()

2.从mongodb中获取信息并且填入mysql,因为有12万条,中间可能有不正确的数据无法填入,分段插入。实际结果表明,insert语句比update语句快了将近十倍不止。最终选择新建一个完全为空的表,采用insert进行插入。

问题:引用的信息提取的有问题。接下来要进行的工作。

from pymongo import MongoClient
from bs4 import BeautifulSoup
from nltk.tokenize import MWETokenizer
import re
import pymysql
import time

# create link
client = MongoClient(‘localhost‘, 27017)
db = client[‘ad‘]   #or db = client.ad
collection = db[‘xml‘]   #create cousin

mongodb_to_mysql_list = []
num = 0
#first [:27810]
#second [27811:60000]
#third [60000:100000]   100000 cant
#[100001:] 9859 cant  109861cant
#[100001:109860]
begin = time.time()
for item in collection.find()[109861:]:
    pmc_xml = item[‘xml‘]
    pmc_id = item[‘pmc_id‘].encode(‘utf-8‘)
    pmc_id = int(pmc_id)
    soup = BeautifulSoup(pmc_xml,"lxml")  #if not add "lxml" will warning but not error

    print num
    #find the journal
    journal = soup.find(‘journal-title‘)
    if journal != None:
        journal=journal.text.encode(‘utf-8‘)
    else:
        journal = ‘‘

    #find the article
    title = soup.find(‘article-title‘)
    if title != None:
        title = title.text.encode(‘utf-8‘)
    else:
        title = ‘‘

    #show the author
    authornamelist = soup.find_all(‘contrib‘)
    namestr = ‘‘
    for x in authornamelist:
        if x.surname != None:
            name = x.surname.text
            if x.surname.next_sibling != None:
                if x.surname.next_sibling.next_sibling != None:
                    name = name +‘ ‘+ x.surname.next_sibling.next_sibling.text
        namestr = namestr+name.encode(‘utf-8‘)+‘,‘

    #show the firt author information
    authorinfor = ‘‘
    authorinfor = soup.find(‘aff‘)
    if authorinfor != None:
        authorinfor =authorinfor.text.encode(‘utf-8‘)
    else:
        authorinfor = ‘‘

    #show the receive time year
    pub_year = soup.find(‘year‘)
    if pub_year != None:
        pub_year=pub_year.text.encode(‘utf-8‘)
    else:
        pub_year=‘‘

    #show the abstract
    a = soup.find(‘abstract‘)
    if a != None:
        if a.p != None:
            abstract = a.p.text.encode(‘utf-8‘)
        else:
            abstract = ‘‘

    #show the key-words
    kwdlist = soup.find_all(‘kwd‘)
    union_kwd_str = ‘‘
    for x in kwdlist:
        kwd = x.text.lower().encode(‘utf-8‘)
        kwdstr = re.sub("\"|,|\.", "", kwd)
        kwd = tuple(kwdstr.split())
        tokenizer = MWETokenizer([kwd])
        union_kwd = tokenizer.tokenize(kwdstr.split())
        if union_kwd != []:
            union_kwd_str = union_kwd_str+union_kwd[0]+‘,‘

    #show the reference id
    pub_id_list = soup.find_all(‘pub-id‘)
    reference_idlist = []
    reference_str = ‘‘
    for x in pub_id_list:
        if x != None:
            reference = x.text.encode(‘utf-8‘)
            reference_idlist.append(reference)
        reference_str = reference_str+reference+‘,‘

    mongodb_to_mysql_list.append((pmc_id,journal,title,abstract,namestr,authorinfor,pub_year,union_kwd_str,reference_str))

    num += 1

print num
end1 = time.time() -begin
print end1

conn= pymysql.connect(
        host=‘localhost‘,
        port = 3306,
        user=‘root‘,
        passwd=‘‘,
        db=‘python‘
        )
cur = conn.cursor()
#cur.executemany(‘update ad set journal=(%s),title=(%s),abstract=(%s),namestr=(%s),authorinfor=(%s),pub_year=(%s),union_kwd_str=(%s),reference_str=(%s) where pmc_id = (%s)‘,mongodb_to_mysql_list)
#99s 100
cur.executemany(‘insert into alzheimer(pmc_id,journal,title,abstract,namestr,authorinfor,pub_year,union_kwd_str,reference_str) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)‘,mongodb_to_mysql_list)
#8.5s 100

#cur.executemany(‘insert into test2(pmc_id,title) values(%s,%s)‘,values)
conn.commit()
cur.close()
conn.close()

end2 = time.time() -begin
print end2
时间: 2024-08-08 19:29:01

提取mongodb中论文的信息,填入mysql,加快统计速度的相关文章

js实现弹窗后选择信息填入text标签中以及需要注意的问题

下面是完整的代码对应两个网页 主网页代码 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8" /> 6 <title>window弹窗</title> 7 </head> 8 9 <body> 10 编号: 11 <input type="text" id="numId" /

使用crash提取vmcore中预分析信息

一.介绍 在linux系统内核发生崩溃或者服务器hang住时,Kdump(kernel crash dump:内核崩溃转储设备)生成vmcore文件,通过分析vmcore信息判断原因,而 crash是一个被广泛应用的内核奔溃转储文件分析工具,前提系统必须安装crash工具和内核调试工具kernel-debuginfo. 二.工具的安装与调试 1.安装包的版本,要与linux内核一致,查看linux内核版本: #uname -a 2.安装.配置.启动kdump:       安装kdump:  

使用正则提取字符串中URL等信息

一.说明 背景:最近在做同步京东商品信息时遇到一个问题,同步后的商品详情无法在富文本中修改,强制修改会导致图片无法正常显示,研究发现详情中的图片是在css的作为背景图指定的. 解决:经过多次尝试,最后使用自定义HTML标签模板,提取css样式中background-image:url的图片地址和尺寸,并替换到自定义的模板中 技术:Java语言.正则表达式 二.代码 public static void main(String[] args) { StringBuilder stringBuild

如何用JavaScript提取URL中的用户信息

比如传递的URL为:http://localhost//a.html?username=aa&password=12,如何用JavaScript提取其中的username和password数据呢?具体方法参考[1]如下所示: 1 function getQueryStringArgs() { 2 // 取得查询字符串并去掉开头的问好 3 var qs = (location.search.length > 0 ? location.search.substring(1) : "&q

关于JS将图片回显问题,将byte[]转化为流,信息填入input框内

1 <script> 2 3 var For_photo = [] 4 var normal_data = new Object(); 5 var Userinfo = JSON.parse(sessionStorage.getItem('Userinformation')); 6 for (var prop in Userinfo) { 7 //$("[name='" + prop + "']").val(ForeignTeachers[prop]);

使用NPOI从Excel中提取图片及图片位置信息

原文:使用NPOI从Excel中提取图片及图片位置信息 问题背景: 话说,在ExcelReport的开发过程中,有一个比较棘手的问题:怎么复制图片呢? 当然,解决这个问题的第一步是:能使用NPOI提取到图片及图片的位置信息.到这里,一切想法都很顺利.但NPOI到底怎么提取图片及图片的位置信息呢?NPOI能不能提取到图片的位置信息呢? 这是两个问题.是两个让BaiGoogleDu几近沉默的问题.但官方教程的评论中还是流露出了答案的蛛丝马迹. 哇咔咔,这是我去看源码寻答案的的动力. 此处省去(N多字

使用Java POI来选择提取Word文档中的表格信息

通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事先需要导入POI的jar包): public static void testWord2() { try { FileInputStream in = new FileInputStream("july 2005 1.doc");// 载入文档 // FileInputStream in

条形码读取控件Softek Barcode Reader Toolkit提取图像中条形码信息

Softek Barcode Reader Toolkit是一款功能强大的条形码读取控件,提取图像中条形码信息的综合工具包.可用在扫描.索引文件的应用程序中.条形码信息可高速准确地从文件中读取,无需介入操作,应用程序就可索引图像. 具体功能: 支持一维和二维条形码 shell(命令解析器)工具. C语言的API(应用程序接口). Perl(实用报表提取语言)模式. Java(TM)类. 图像消噪. 兼容常规的表达形式. 通过条形码的位置可分离多页的TIF文件. 支持彩色图像, 创建Code 39

python学习笔记——爬虫中提取网页中的信息

1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层.因此,它也被称为自描述的结构.常见的半结构数据有HTML,XML和JSON等,实际上是以树或者图的结构来存储的. <person> <name>A</name> &l