根据年份提取dblp内容

根据年份提取dblp内容,第1张

根据年份提取dblp内容

文章目录

  • 前言
  • 一、pandas是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

最近在做dblp数据集相关预处理工作,根据老师给定的论文,需要按照年份划分提取信息,年份是从1970--2008年。

一、分析dblp数据结构

从官网上下载dblp最早版本的数据集(不是最新的,最新的有2.1G),大约是1.12GB,XML格式,刚开始老师和我准备手工清洗,只清洗了一年的就好困难,果断放弃,让我想办法编程试一下。

查看各种博客后,发现可以用sax进行解析,十分方便。

二、python代码 1.提取article类型文章

代码如下:

#!/usr/bin/python
# use xml.sax, because it support external entity expansion
# this program will extract all article elements in dblp.xml into inProceedings.xml
import xml.sax
import codecs
from xml.sax.saxutils import escape


# a handler class  for xml.sax.parse(source,handler)
class dblpHandler(xml.sax.handler.ContentHandler):
    def __init__(self):
        # xml.sax.ContentHandler.__init__(self)
        self.isArticle = 0
        self.outfile = codecs.open('data/article.xml', 'w', 'utf-8')
        self.outfile.write('n')
        self.outfile.write('n')
        self.outfile.write('nn')

    # starting tag of an element
    def startElement(self, name, attrs):
        if name == 'article':
            self.isArticle = 1
            self.outfile.write('n')
        elif self.isArticle == 1:
            self.outfile.write('<' + name + '>')

    # ending tag of an element
    def endElement(self, name):
        if name == 'article':
            self.outfile.write('
nn')             self.isArticle = 0         elif self.isArticle == 1:             self.outfile.write('n')     # write content in and     def characters(self, content):         if self.isArticle == 1:             if not content.isspace():                 self.outfile.write(escape(content))     # write the ending file tag for article.xml and close the written file     def close_file(self):         self.outfile.write('')         self.outfile.close() if __name__ == '__main__':     dblp = dblpHandler()     source = open('./data/dblp.xml', 'r')     xml.sax.parse(source, dblp)     dblp.close_file()     print("extract successfully!")

和老师进行讨论之后,只需要提取article和inproceedings类型文章。将上述提取article类型的代码改成提取inproceeding

2.按照年份提取

代码如下:

#!/usr/bin/python
#use xml.sax, because it support external entity expansion
#this program will extract all article elements in dblp.xml into inProceedings.xml
import xml.sax
import codecs
from xml.sax.saxutils import escape
from multiprocessing import Pool


# a handler class  for xml.sax.parse(source,handler)
class dblpHandler(xml.sax.handler.ContentHandler):
    def __init__(self,year):
        #xml.sax.ContentHandler.__init__(self)
        self.isArticle = 0
        self.buffer = '' 
        self.isYear = 0
        self.year = year
        self.currentYear = 0   # year for current parsing article paper
        #self.outfile = codecs.open('data/inProceedings.xml','w','utf-8')
        self.outfile = codecs.open('data/'+str(year)+'article.xml','w','utf-8')
        self.outfile.write('n')
        self.outfile.write('n')
        self.outfile.write('nn')


    #starting tag of an element
    def startElement(self, name, attrs):
        if name == 'article':
            self.isArticle = 1
            #self.outfile.write('n')
            self.buffer += 'n'
        elif self.isArticle == 1:    # name != inproceedings and isInProceedings == 1
            #self.outfile.write('<'+name+'>')
            self.buffer += '<'+name+'>'
            if name == 'year':
                self.isYear = 1


    #ending tag of an element
    def endElement(self,name):
        if name == 'article':
            #self.outfile.write('nn')
            self.buffer += 'nn'
            if self.currentYear == self.year:
                self.outfile.write(self.buffer)
            self.buffer = ''
            self.isArticle = 0
        elif self.isArticle == 1:
            #self.outfile.write('n')
            self.buffer += 'n'
            if name == 'year':
                self.isYear = 0


    #write content in  and 
    def characters(self,content):
        if self.isArticle == 1:
            if not content.isspace():
                #self.outfile.write(escape(content))
                self.buffer += escape(content)
        if self.isYear == 1:
            self.currentYear = int(content)


    #write the ending file tag for inProceeding.xml and close the written file
    def close_file(self):
        self.outfile.write('')
        self.outfile.close()


if __name__ == '__main__':
    for year in reversed(range(1970,2009)):
        dblp = dblpHandler(year)
        source = open('./data/article.xml','r',encoding='utf-8')
        xml.sax.parse(source, dblp)
        dblp.close_file()
        print("compelete!")

最后,会得到article1970--article2008和inproceedings1970--inproceedings2008的xml文件。


总结

本次代码是根据GitHub上相关代码改编的,可能不是很有效,但是最后还是得到清洗后的数据,下次要进行作者提取。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/3972919.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-10-21
下一篇2022-10-21

发表评论

登录后才能评论

评论列表(0条)

保存