会务准备期间材料准备工作具体实施总结(vim, python, microsoft word)
span.kw { color: #007020; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #40a070; }
code > span.fl { color: #40a070; }
code > span.ch { color: #4070a0; }
code > span.st { color: #4070a0; }
code > span.co { color: #60a0b0; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #06287e; }
code > span.er { color: #ff0000; font-weight: bold; }
-->
会务准备期间材料准备工作具体实施总结(vim, python, microsoft word)
Zhongxiewei
Tue Jun 10
前言
进来要准备会议期间的相关材料,包括各个参会人员的个人信息,如:姓名、所属单位、邮件、投递的文章、以及文章中属第几个作者,以及投递的文章信息,如:文章编号、文章标题、不同的作者、各个作者所属的单位、以及文章的摘要信息。需要对其进行整理,按照一定的格式调整完成之后,出版成册,同时还需要为各个参会人员定制相应的胸牌。
接下来的内容将围绕上述给出的整个过程,总结了个人如何利用相关的工具完成该工作,并且对某些工具的使用给出了一个简单的描述。另外,由于刚接到任务到任务截止的时间有点仓促,并没有选择最佳的实现方式,只是单纯的选取了自己熟悉的简单的实现方式,对于可能的存在的最佳的方式,也给出了一些个人的看法。
各种信息的获取
由于后期格式的调整,胸牌的制定等都是在知道参会人员各种详细的资料之后进行的。因此,对于信息的获取是最先需要完成,也是最为重要的一个环节。如果,这个过程没有采用很好的方式进行完成,那么可能导致的结果是,当突然所有人的某个信息需要重新调整之后,几乎所有的工作将被推倒重来,使得原先花费的时间、精力就像烟雾一般,散了就没了(当然这里指代的烟雾跟雾霾是差十万八千里的)。
因此,迫切的需要一种节省人力资源的方式来获取相应的参会信息。
参会信息主要由以下的可能来源:
- PDF版本的内容
- 网页中的表单信息
那么下面将主要介绍了如何从pdf以及网页中如何提取你想要的信息。
pdf信息获取
pdf的模板信息如下:
pdf 模板信息
从模板信息中可以得到的规律如下:每一个表中包含需要得到的信息,(Full) Paper Number, Tracking Number, Title, Contact Author, affiliation, Email, Full Author List, Abstract Text,因此我们对文件按照上述的关键词进行遍历,就能够获取相应的信息。
实施方法
为了能够快速的完成信息提取的任务,首先需要想到的是,如何将上述的文本信息提取出来,一种最为费时费事的方法是采用CTRL-C加CTRL-V的方法,还有一种方法是先将pdf格式的文件另存为成文本格式的文件,然后在利用熟悉的变成语言进行处理。由于第一种方法实施的开销时间和待处理文件的量成正比关系,因此对200多条信息的获取,我们采用的是后面的方法。
直接通过复制的方式,将pdf中的文本复制到target.txt文件中。然后根据需要提取信息的关键词进行简单编程,python实现如下:
# -*- coding: utf-8 -*-
import sys
def process(inFileName, outFileName):
"""利用关键词,从输入文件中获取相应的信息,并将其
存储到输出文件中。
关键词有:
1. (Full) Paper Number:
2. Title:
3. Full Author List:
4. Abstract:
"""
# the last keywords was helped to extracting abstract
keyWordList = [‘(Full) Paper Number:‘, ‘Title:‘, ‘Full Author List:‘, ‘Abstract Text:‘, ‘Topic Choices:‘]
inFid = open(inFileName)
outFid = open(outFileName, ‘w‘)
line = inFid.readline()
while line != ‘‘:
line = line.strip()
if line.startswith(keyWordList[0]):
paperNum = line
elif line.startswith(keyWordList[1]):
title = line
elif line.startswith(keyWordList[2]):
authorList = line
elif line.startswith(keyWordList[3]):
abstractText = line
line = inFid.readline().strip()
while not line.startswith(keyWordList[4]):
abstractText = abstractText + line
line = inFid.readline().strip()
outFid.write(paperNum + ‘\n‘ + title + ‘\n‘ + authorList + ‘\n‘ +
abstractText + ‘\n\n‘)
line = inFid.readline()
inFid.close()
outFid.close()
if __name__ == ‘__main__‘:
process(sys.argv[1], sys.argv[2])
通过下面的命令行,可以将target.txt中需要的信息提取到result.txt
python process.py target.txt result.txt
网页中的信息获取
将pibm会议的网页中的相关内容另存为网页格式保存。打开后的网页如下所示:
网页格式
从显示出来的网页格式中,我们能够很容易的发现,以下信息:文章编号,标题,作者姓名,摘要;但是没有作者单位的信息,是真的没有该信息吗?其实不然。
深入的来看一下该html格式的文件的源代码吧。
source code of the file
从图中淡蓝色区域就能够看出,作者的单位,邮件信息等并没有直接在浏览器中显示,于是我们可以断定,我们想要的信息都在该保存的网页文件中。那么如何从150多个文件中提取出想要的信息呢。
很快就能够就能够想到的就是直接利用相关的编程语言,结合网页parsing工具包进行处理,例如java结合jsoup,但是还有一种更加简单的方法,就是利用vim编辑器自带的功能。考虑到效率性问题,采用第二个方法。
更多关于vim的介绍将在下一节讲解。
将所有保存的网页文件放置于同一个目录下,如:
...
110.html
111.html
112.html
113.html
...
用vim打开所有的文件
vim *.html
然后在文件中寻找能够提取想要的信息的标签,具体有h2,Paper No.:, ShowAuthorDetails, Abstract Text for Technical Review:.
// Title
<h2 style="line-height: 24px;">gastric cancer target detection using near-infrared hyperspectral imaging with chemometrics</h2>
// Paper number
<span class="EmphesisFont">Paper No.: </span><span id="ctl00_Main_lblfullSubmissionNumber" class="formText07">9230-110</span>
// Authors
<td class="tallCells">
<div style="float: left; width: 164px;">
<div style="text-align: right;">
<span class="EmphesisFont">Author(s):</span>
</div>
</div>
<div style="margin-left: 170px;">
<div>
<span id="ctl00_Main_lblPrimaryAuthor">Dr. Weisong Yi</span> <a href="#" class="formLink06" style="text-decoration: underline;" onclick="ShowAuthorDetails(‘Dr. Weisong Yi‘, ‘College of Science, Huazhong Agricultural University, China‘, ‘86 2787282197‘, ‘weisong_yi@163.com‘); return false;">view details</a>
</div>
<div>
Dr. Jian Zhang <a href="#" class="formLink06" style="text-decoration: underline;" onclick="ShowCoAuthorDetails(‘Dr. Jian Zhang‘, ‘College of Resources and Environment, Huazhong Agricultural University, China‘, ‘ ‘, ‘zhangjian@mail.hzau.edu.cn‘); return false;">view details</a><br/>Mr. Houmin Jiang <a href="#" class="formLink06" style="text-decoration: underline;" onclick="ShowCoAuthorDetails(‘Mr. Houmin Jiang‘, ‘People’s Hospital of Huangpi District, China‘, ‘ ‘, ‘jianghoumin@163.com‘); return false;">view details</a><br/>Dr. Niya Zhang <a href="#" class="formLink06" style="text-decoration: underline;" onclick="ShowCoAuthorDetails(‘Dr. Niya Zhang‘, ‘College of Animal Science, Huazhong Agricultural University, China‘, ‘ ‘, ‘zhangniya@mail.hzau.edu.cn‘); return false;">view details</a>
</div>
</div>
</td>
// Abstract
<tr> <td class="tallCells"> <div style="float: left; width: 160px;"> <div style="text-align: right;"> <span class="EmphesisFont">Abstract Text for Technical Review:</span> </div> </div> <div style="margin-left: 170px; margin-bottom: 4px;"><div style="overflow-y: auto; height: 200px; border: solid 1px #aaaaaa; width: 466px;"><div style="padding: 4px 4px 4px 4px;">Gastric cancer is one of the leading causes of cancer death in the world due to its high morbidity and mortality. Hyperspectral imaging (HSI) is an emerging, non-destructive, cutting edge analytical technology that combines conventional imaging and spectroscopy in one single system. The manuscript has investigated the application of near-infrared hyperspectral imaging (900-1700 nm) (NIR-HSI) for gastric cancer detection with weight algorithms. Major spectral differences were observed in three regions (950-1050, 1150-1250, and 1400-1500 nm). By inspecting cancerous mean spectrum three major absorption bands were observed around 975, 1215 and 1450 nm. Furthermore, the cancer target detection results are consistent and conformed with histopathological examination results. These results suggest that NIR-HSI is a simple, feasible and sensitive optical diagnostic technology for gastric cancer target detection with chemometrics.</div> </div> </div> </td> </tr>
接下来需要完成的任务就是在想要提取的信息周围加上自己的标签,如,方便后期更方便的进行信息的提取。利用vim进行正则表达式识别,然后再利用替换的方法,对匹配的内容进行替换。
正对不同的内容,采用的正则表达式分别为:
- 对于title使用的正则表达式:
/\vh2[^>]*\>\zs((.|\_s)*)\ze\<\/h2\>
匹配后的结果如图中高亮部分所示:
- Paper Number的正则表达式为:
/\vPaper No%(.|\_s)*\>\zs(9230-\d+)\ze\<\/span
匹配后的结果如图中高亮部分所示:
- authors匹配的正则表达式为:
/\vonclick\="Show\w+\(\zs(.{-})\ze\)%(.|\_s){-}Contact
匹配后结果如图中高亮部分所示:
- Abstract匹配的正则表达式为:
/\vAbstract Text.*4px;\"\>\zs(%(.|\_s){-})\ze\<\/div
匹配后结果如图中高亮部分所示:
在每次匹配之后,还需要进行替换,在匹配的内容的两边加上我们给出的标签。所采用的命令为::argdo %s//<result>\1<\/result>/g | update
为了更快速的执行上述的命令,我们首先需要将保存的文件中明显的不需要的部分给清理干净,如将第一行到标题的前一行都删除::argdo 1,1824delete | update
到目前为止,我们给需要的内容打上了属于我们的标签,另外由于标签的头和尾可能不存在于同一行,因此,我们不能够直接借用简单的匹配工具将标签包围的内容给提取出来,于是再次借用了python对文档进行处理。
# -*- coding:utf-8 -*-
import glob
files = glob.glob(‘*.html‘)
files.sort()
strTag = ‘result‘
startTag = ‘<‘ + strTag + ‘>‘
endTag = ‘</‘ + strTag + ‘>‘
inTag = False
matchLine = ‘‘
for file in files:
with open(file) as fid:
for line in fid:
line = line.strip()
if (startTag in line) and (endTag in line):
matchLine = line[
line.find(startTag)+len(startTag):
line.find(endTag)].strip()
print matchLine
elif startTag in line:
matchLine = line[
line.find(startTag)+len(startTag):].strip()
inTag = True
elif endTag in line:
matchLine = matchLine + line[:line.find(endTag)].strip()
inTag = False
print matchLine
elif inTag:
matchLine = matchLine + line
print ‘\n‘
处理后的结果如下图所示:
pibmhtmlresult
Vim most basic thing
Reading the content in vimtutor step by step.
在vimtutor文中关于vim基本用法的小结
- 光标的移动
h(left) j(down) k(up) l(right)
- 退出vim
:q! 丢弃所有的更改
:wq 保存后退出 - 删除光标所在的字符: x
- 文本的插入
i type inserted text 在光标的前面插入文字
A type appended text 在行末尾添加文字 - 删除一个单词(delete a word)
dw 删除光标所在的位置到下一个单词之前(不包括该字符)
de 删除光标所在的位置到该单词的结尾(包括结尾的字符),e表示the end of the word - 删除光标所在的位置直到一句话的结尾: d$
- 删除一行: dd
- 使用一个数字表示一个行为的重复次数,如: 2w(向前移动两个单词), d2w(删除两个单词)
- 移动到一句话的开始: 0
- undo前一个行为: u
undo一句话的行为: U
撤销undo: CTRL-R - 将delete的内容重新复制到光标所在位置之后: p
- 用一个字符替换光标所在的位置的字符: type r and then the character (你想输入的字符)
- 改变一个单词以及改变光标所在的位置到行末的内容: ce, c$
- CTRL-G 显示光标在文件的哪个位置,以及文件的状态
G 将光标移动到文件的末尾
number G 将光标移动到number对应的行
gg 将光标移动到第一行 - / 向前搜索; ?向后搜索; n表示下一个,N表示上一个, CTRL-O回到原始的位置,CTRL-I回到最新的位置
- % 使得光标在括号之间切换位置,如
(), [], {}
- 将当前行的old换成new :s/old/new
将当前行所有的old换成new :s/old/new/g
将不同行之间的所有old换成new :1,100s/old/new/g
将文件中所有位置出现的old换成new :%s/old/new/g - o 在当前行下面添加一行;O在当前行上面添加一新行
- y 进行文本复制操作;p 进行文本粘帖操作
- R 进入文本替换模式,退出
应用举例
字符串排序
有一系列的文章,最初的编号为9230-1,9230-2,9230-3,一直到9230-100; 现要对其进行处理,使得改序列在excel的排序过程中能够顺利进行排序。
- 常见的排序方式介绍
一般的排序方式有两种, 按数字排序以及按字符大小排序。 按数字排序,很容易理解,如: (1, 3, 20, 9, 35) 进行排序后的结果为: (1, 3, 9, 20, 35); 而按文字排序, 先会比较第一个字符的大小, 常见的大小是按照ascii的顺序进行排序的, asscii的表如下:
0 NUL 16 DLE 32 48 0 64 @ 80 P 96 ` 112 p
1 SOH 17 DC1 33 ! 49 1 65 A 81 Q 97 a 113 q
2 STX 18 DC2 34 " 50 2 66 B 82 R 98 b 114 r
3 ETX 19 DC3 35 # 51 3 67 C 83 S 99 c 115 s
4 EOT 20 DC4 36 $ 52 4 68 D 84 T 100 d 116 t
5 ENQ 21 NAK 37 % 53 5 69 E 85 U 101 e 117 u
6 ACK 22 SYN 38 & 54 6 70 F 86 V 102 f 118 v
7 BEL 23 ETB 39 ‘ 55 7 71 G 87 W 103 g 119 w
8 BS 24 CAN 40 ( 56 8 72 H 88 X 104 h 120 x
9 HT 25 EM 41 ) 57 9 73 I 89 Y 105 i 121 y
10 LF 26 SUB 42 * 58 : 74 J 90 Z 106 j 122 z
11 VT 27 ESC 43 + 59 ; 75 K 91 [ 107 k 123 {
12 FF 28 FS 44 , 60 < 76 L 92 \ 108 l 124 |
13 CR 29 GS 45 - 61 = 77 M 93 ] 109 m 125 }
14 SO 30 RS 46 . 62 > 78 N 94 ^ 110 n 126 ~
15 SI 31 US 47 / 63 ? 79 O 95 _ 111 o 127 DEL
- 使得编号能够进行字符排序
由于编号的字符串的长度不相等,如9230-2比9230-100短,如果直接按照字符串进行排序,9230-100将比9230-2小,因此需要将9230-2更改成9230-002,使用的方法如下:
numberchange
字符串修改
获取得到的名字信息都具有相应的称谓,如Miss,Pro., Dr.等等,因此在获取完整的名字之前,首先需要去除相应的称谓。具体操作如下:
namechange
文本信息格式化
这里很容易想到一个出色的排版工具latex,但是由于大伙对于latex完全不知,仍然选用了word作为排版工具。那么作为word这样的工具,在进行格式排版的时候真的只能使用格式刷一个一个重复进行排版吗?其实不然。
浏览器想必都是大家在平常的生活工作中接触最多的软件之一,不同的网页在抵达浏览器之后都会以一个清晰的排版方式出现在大家的眼前,该功能的具体实现是在内容的两端添加了相应的标签,对内容的属性进行了说明,如:<h1>title</h1>
,表示一级标题等。如果能够提前获得格式排版的一些列标签,那么就只要将相应的内容进行更新就能够复用这些标签。同时,又恰好word文档能够直接另存为html格式的文档,使得对word文档进行格式化批量处理成为了可能。
格式模板的获取
首先,新建立一个word文档,输入一个范例,然后另存为html格式的文档,如下所示。
doc style
可见我们针对的主要格式有:文章编号,文章标题,作者,作者单位,摘要,空行,5个大类。再进一步查看一下html文档内部的内容:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="LibreOffice 4.1.3.2 (Linux)">
<META NAME="CREATED" CONTENT="20140619;152737802230336">
<META NAME="CHANGED" CONTENT="0;0">
<STYLE TYPE="text/css">
<!--
@page { margin: 0.79in }
P { margin-bottom: 0.08in }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
<P ALIGN=LEFT STYLE="margin-bottom: 0in"><FONT SIZE=4><B>Paper No.</B></FONT></P>
<P ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT SIZE=4><B>Title</B></FONT></P>
<P ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT SIZE=3>Authors</FONT></P>
<P ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 10pt"><I>Affiliation</I></FONT></P>
<P ALIGN=LEFT STYLE="margin-bottom: 0in"><BR> </P>
<P ALIGN=JUSTIFY STYLE="margin-bottom: 0in">Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract,Abstract</P>
<P STYLE="margin-bottom: 0in"><BR> </P>
<P STYLE="margin-bottom: 0in"><BR> </P>
</BODY>
</HTML>
此刻从源代码的内容中可以很清除的知道:
- 文章编号对应的模板为:
<P ALIGN=LEFT STYLE="margin-bottom: 0in"><FONT SIZE=4><B>{}</B></FONT></P>
; - 文章标题对应的模板为:
<P ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT SIZE=4><B>{}</B></FONT></P>
; - 作者对应的模板为:
<P ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT SIZE=3>{}</FONT></P>
; - 作者单位对应的模板为:
<P ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 10pt"><I>{}</I></FONT></P>
; - 空行对应的模板为:
<P STYLE="margin-bottom: 0in"><BR> </P>
; - 摘要对应的模板为:
<P ALIGN=JUSTIFY STYLE="margin-bottom: 0in">{}</P>
其中{}
表示需要添加内容的地方,剩余的部分可以当作文档的head和foot。于是利用熟悉的编程语言就能够很快的实现文档的格式化,此处选用了python进行处理。
格式套用批量化的实现
完整代码:
# -*- coding:utf-8 -*-
import re
def writeInfo(fid, paperNumber, title, authors, abstractContent):
""" Write the informations of one paper to file """
fid.write(paperNumberStyle.format(paperNumber) + ‘\n‘)
fid.write(titleStyle.format(title) + ‘\n‘)
authorName = ‘‘
authorAffiliation = []
p = re.compile("‘(.*?)‘")
for author in authors:
iters = p.finditer(author)
i = -1
for subiter in iters:
i = i+1
if i == 0:
separator = ‘‘
if authorName != ‘‘:
separator = ‘,‘
authorName = authorName + separator + subiter.group().strip("‘")
elif i == 1:
authorAffiliation.append(subiter.group().strip("‘"))
else:
break
fid.write(authorStyle.format(authorName) + ‘\n‘)
for affiliation in authorAffiliation:
fid.write(affiliationStyle.format(affiliation) + ‘\n‘)
fid.write(abstractStyle.format(abstractContent) + ‘\n‘)
fid.write(newlineStyle + ‘\n‘)
fid.write(newlineStyle + ‘\n‘)
headStyle = """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="LibreOffice 4.1.3.2 (Linux)">
<META NAME="CREATED" CONTENT="20140619;152737802230336">
<META NAME="CHANGED" CONTENT="0;0">
<STYLE TYPE="text/css">
<!--
@page { margin: 0.79in }
P { margin-bottom: 0.08in }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
"""
footStyle = """
</BODY>
</HTML>
"""
paperNumberStyle = ‘<P ALIGN=LEFT STYLE="margin-bottom: 0in"><FONT SIZE=4><B>Paper No.: {}</B></FONT></P>‘
titleStyle = ‘<P ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT SIZE=4><B>{}</B></FONT></P>‘
authorStyle = ‘<P ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT SIZE=3>{}</FONT></P>‘
affiliationStyle = ‘<P ALIGN=CENTER STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 10pt"><I>{}</I></FONT></P>‘
newlineStyle = ‘<P STYLE="margin-bottom: 0in"><BR></P>‘
abstractStyle = ‘<P ALIGN=JUSTIFY STYLE="margin-bottom: 0in">{}</P>‘
fidOut = open(‘withstyle.html‘, ‘w‘)
fidOut.write(headStyle)
with open(‘out.result‘) as fid:
line = fid.readline().strip()
while line != ‘‘:
title = line
paperNumber = fid.readline().strip()
authors = []
line = fid.readline().strip()
while line.startswith("‘"):
authors.append(line)
line = fid.readline().strip()
abstractContent = line
writeInfo(fidOut, paperNumber, title, authors, abstractContent)
fid.readline()
fid.readline()
line = fid.readline().strip()
fidOut.write(footStyle)
fidOut.close()
得到的结果如下图所示:
After adjust the style
最后另存为word就成功完成了格式调整的任务了。
一些细节上的东西,如作者单位的顺序,编号等,再额外的调整一下即可,当然直接在程序上进行优化也能够得到相应的结果。
题外话
由于这里的数据量比较少,因此直接将数据信息存储在单文本文件中,如果待处理的数据量不断增大的时候,可以选用合适的数据库对数据进行存储。
会务准备期间材料准备工作具体实施总结 ----(vim技巧应用, python信息提取与整合, microsoft word格式调整批量化)