杨晓凯
温州医科大学温州市第三临床学院/温州市人民医院
【摘要】目的 基于混合编程技术,使用Lazarus和Perl语言等设计开发文献管理系统,满足科技管理人员的工作需求。方法 调查分析三大中文数据库(CNKI、万方数据库和维普数据库)中的导出格式和著录项目内容,选用著录项目较多的NoteExpress格式作为拟转换格式,按照GB/T 7714-2015.信息与文献.参考文献著录规则建立和BibTex格式的对应关系,以BibTex作为最终格式和中间格式,实现和Endnote格式的相互转换。使用Perl语言实现数据下载、提取、分析和格式转换功能,使用Lazarus实现界面开发。结论 基于混合编程技术的文献管理系统开发,利用了Lazarus快速界面开发和perl语言快捷文本处理的优势,能够提高程序开发效率,实现任务目标。
【关键词】混合编程;文献管理;Lazarus;Perl;BibTex; Endnote
作者单位:325000 浙江省温州市,温州市人民医院
[作者简介] 杨晓凯(1973-),男(汉族),浙江省温州市人,硕士,主任医师。
*通讯作者,Email:yakeworld@126.com
背景
文献管理软件的功能包括文献信息的收集、文献信息的整理和组织、论文中对文献引用的插入和参考书目的生成。对于科技管理人员,还需要其他功能包括批量文献数据采集,文献数据合并,文献统计分析,文献数据导出和发布等。
目前通用的文献管理软件比较多,商业性软件包括EndNote、Reference Manager、ProCite、RefWorks、NoteExpress、NoteFirst、Citavi、医学文献王,免费软件包括知网研学、Zotero、Mendeley、JabRef等[1]。
但这些软件主要面向的对象为科技工作者,其功能包括个人知识管理、论文写作、构建专题数据库、科技查新、编辑工作等,还不能满足科技管理人员的工作需求。所以有必要开发系统实现相关功能。
文献数据采集
三大中文数据库(CNKI、万方数据库和维普数据库)支持导出各种格式参考文献,但著录项目内容范围并不一致,缺乏规范。CNKI支持导出知网研学、Refworks、EndNote、NoteExpress、NoteFirst及自定义格式,各种格式的内容范围各不一致。万方同样支持导出各种格式,包括Refworks、EndNote、NoteExpress、NoteFirst、Bibtex格式及自定义格式,但内容范围也不一致。维普支持导出格式较少,仅包括ENDNOTE、NoteExpress和自定义格式。各种文献导出格式,大都服务于常规文献管理,著录项目内容有限,其中著录项目较多为NoteExpress格式。可以通过不同格式合并或者检索和文摘页码进一步提取信息。
著录项目格式
不同的参考文献管理软件,其使用的文献数据保存格式并不相同。Endnote软件由Thomson Reuters公司开发,是最好的文献管理工具之一,其文件格式常被选用为中间格式用于转换成其他格式。但是Endnote格式著录项目只有52项,其中8项可以用于自定义其他内容,其他均有特指,这对于常规文献管理是足够的,但是对于科技管理文献分析是不够的,不能记录其他更加详尽的著录项目。
LaTeX 是国际学术界最流行的排版系统之一,其使用BibTex来引用文献。BibTex由Oren Patashnik在1988年开发,其对文献类型和著录项目的定义和推荐已是事实上的标准[2]。虽然BibTex有规定其标准文献类型和著录项目[2],但由于其格式的开发性,根据需要,BibTex可以对文献类型和著录项目进行扩充,以满足GB/T 7714-2015信息与文献.参考文献著录规则等需求[3]。
由于文献管理软件众多,并使用不同的格式管理文件,其著录项目名称和范围各有不同,难以在各种格式之间直接进行转换,通常是先转成中间格式再进行转换。
EnoNote格式由于使用较为普遍,是较常采用的中间格式,但其著录项目只有52项,限制了应用范围。
BibTex格式著录项目名称直观,能够自由扩充著录项目,是较好的中间格式,前提是要建立和其他格式的对应关系。
格式转换
国内有文献报道文献著录项目格式的转换和导入。江占勇开发的CvtCNKI可以将中国期刊网(CNKI)等国内数据库提供的不规则文献著录项目信息转换为标准格式,以便导入到EndNote等文献管理工具[4]。2010年, 李安邦等开发的Cvt Enw软件使用JavaScript脚本程序从三大中文数据库网页中抓取文献著录项目信息生产Endnote格式[4]。目前三大中文数据库已经支持导出各种格式参考文献以满足导入各种参考文献管理文件的需求。存在的问题是著录项目内容不能满足科技管理需求,格式转换的需求依然存在。
以BibTex作为中间格式,实现各种参考文献格式转换,需要根据GB/T 7714-2015规范要求和科技管理需要扩充和规范BibTex著录文献类型和著录项目,在此基础上建立和各种参考文献格式的对应关系,无法直接对应的可再次扩充BibTex格式。
文献类型分析
BibTex中标准文献类型包括期刊的析出文献(article),普通图书(book),图书的析出文献(incollection),会议录的析出文献(inproceedings 或 conference),学位论文(mastersthesis 或 phdthesis),会议录(proceedings),报告(techreport),其他(misc)[2],这些在GB/T 7714-2015中有直接对应。
除此之外,GB/T 7714-2015中有而BibTex中不属于标准文献类型的包括:档案(archive),汇编(collection),数据库(database),数据集(dataset),舆图(map),报纸(newspaper),电子公告(online),专利(patent),计算机程序(software),标准(standard);BibTex中属于标准类型而GB/T 7714-2015没有直接对应的有:小册子(booklet),书籍部分(inbook),技术手册(manual),未出版文档(unplublished)。
著录项目分析
不同文献类型的著录项目信息范围有所不同。《GB/T 7714-2015.信息与文献.参考文献著录规则》规定了各个学科、各种类型信息资源的参考文献的著录项目、著录顺序、著录用符号、著录用文字、各个著录项目的著录方法以及参考文献在正文中的标注法。但标准适用于著者和编辑著录参考文献,而不是供图书馆员、文献目录编制者以及索引编辑者使用的文献著录规则[5][6]。
基于写作的文献管理需要的期刊著录项目信息包括主要责任者(author),题名(title),期刊题名(journal),出版年(year),卷(volume),期(number),引文页码(pages),以及数字对象唯一标识符(doi)。不同文献类型的著录项目信息范围有所不同,需要按照GB/T 7714-2015参考文献著录规则。
BibTex中著录项目包括出版地(address), 主要责任者(author), 图书题名(booktitle), 版本(edition), 机构(用于techreport)(institution), 期刊题名(journal), 拼音(用于排序)(key), 期(或者专利号)(number), 组织(用于会议)(organization), 引文页码(pages), 出版者(publisher), 学校(用于phdthesis)(school), 系列(series), 题名(title), 卷(volume), 出版年(year), 这些在GB/T 7714-2015中有直接对应[5][2][3]。
除此之外,GB/T 7714-2015中有而BibTex中不属于标准著录项目的包括:更新或修改日期(date),数字对象唯一标识符(doi),编辑(editor),语言(language),文献类型标识(mark),载体类型标识(medium),翻译者(translator),获取和访问路径(url),引用日期(urldate);BibTex中属于标准著录项目而GB/T 7714-2015没有直接对应的有:注解(annote),章(chapter),交叉引用关键词(crossref),出版方式(howpublished),月(month),笔记(note),类型(type)[5][2][3]。
LaTeX的自带参考文献宏包natbib还扩充支持ISBN、ISSN、URL、DOI、EID著录项目[7]。gbt7714宏包[3]能够支持GB/T 7714—2015标准,不支持的 BibTeX 标准著录项目有 annote, chapter, crossref, month, type,也不支持ISBN、ISSN、EID。
对于科技管理工作,要求的著录项目信息范围较广,以满足和实现管理和统计功能。比如,医院学科建设情况汇总要求上报的论文信息除了论文题目、刊物名称、期刊名称、年份、卷、期、页、所有作者,还包括发表时间、是否SCI、排名、索引情况、影响因子、被引用次数、通讯作者。不仅如此,医院科研管理工作,还需要分析作者的科室部门,期刊等级,是否本院论文(作者单位本院排列第一),是否属于论著。
开发语言选择
文献数据的采集分析和格式转换,需要操作文本进行正则分析。Perl语言很容易操作文本,其内置的正则表达式利于分析提取数据,其哈希结构适合建立著录项目对应关系。Perl6 相对于 Perl5 做了革命性的改革,拥有丰富的语言特征、支持多线程、正则表达式更加灵活,在字符处理方面更加轻便。最终实现的文献管理系统要使用BibTex格式进行文献管理,并进行各种格式的转换和生产各种报表,需要良好的用户操作界面。Perl虽然也支持图形界面编程,但实现复杂功能较繁琐。Lazarus是一个开源免费的快速应用开发工具,是面向对象的 Pascal 集成开发环境,具备很强的图形界面开发功能,具备快速简单方便等特点。可以通过TProcess调用perl编译的外部程序实现功能整合。
技术结构
选择BibTex作为中间格式,确保文献信息不丢失以便转换成其他格式。首先建立NoteExpress格式到BibTex格式的转换对应关系以实现将采集的文献数据转换成BibTex格式(表1、2)。然后将EndNote等格式和BibTex格式建立明确对应关系以实现格式之间的相互转换[8][9](表1、3)。
在先前的项目中我们曾用Perl语言实现格式的转换[10]。但是用Raku语言来实现其代码更加简洁,Grammar特性还可以封装复杂的正则表达式,逻辑更加清晰。
所实现的功能包括:NoteExpress和BibTex格式相互转换,Endnote和BibTex格式相互转换,Endnote和NoteExpress格式相互转换,以及各种格式导出为参考文献格式、网页格式和Excel格式等。网页文件使用了jQuery表格插件dataTables,支持检索、筛选等交互功能。
使用 Grammars 解析BibTex格式
grammar Bib {
regex TOP { <prefix>? <bib>+ % \n}
regex prefix {<-[\@]>+}
regex bib { \@<type>\{\,\n<bibkv>+\}\n}
regex type {<-[\{]>+}
regex bibkv {\s*<key>\s*\=\s*\{<value>\}\,*\n}
regex key {<-[\{]>+?}
regex value {<-[\{]>+}
};
my $content=$file_bib.IO.slurp;
Bib.parse($content);
say $/;
界面框架使用Lazarus来开发,可以快速生成菜单,并支持快捷键调用Perl程序功能(图1)。Lazarus使用的Pascal语言语法简单,调用外部程序关键代码:
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.Executable:= PerlFileName;
AProcess.Parameters.Add('bib_to_endnote');
AProcess.Parameters.Add(BibFileName);
AProcess.Parameters.Add(BibFileName+'.enw');
AProcess.Options := AProcess.Options + [poWaitOnExit,poNoConsole];
AProcess.Execute;
AProcess.Free;
end;
表1 NoteExpress、BibTex和Endnote格式著录项目对应关系
NoteExpress | BibTex | Endnote |
---|---|---|
URL | url | %U |
Corporate Author | reviewed_item | %* |
Tertiary Author | tertiary_author | Nill |
GCH | call_number | %L |
Keywords | keywords | %K |
JumpPage | jumppage | %] |
Place Published | address | %C |
Type of Work | type | %9 |
Pages | pages | %P |
Subsidiary Author | subsidiary_author | %? |
Translated Journal | translated_journal | %2 |
Translated Abstract | translated_abstract | %3 |
Volume | volume | %V |
Database Provider | database | %W |
Vol | volume | %V |
Translated Author | translated_author | %H |
Year | year | %D |
Tertiary Title | tertiary_title | %S |
Issue | number | %N |
Language | language | %G |
Title | title | %T |
BeginPage | beginpage | %# |
Translated Title | translated_title | %Q |
Translated Keywords | translated_keywords | %4 |
Date | date | %8 |
Journal | journal | %J |
Subsidiary Author, | subsidiary_author | %? |
ISBN/ISSN | issn | %@ |
Data | year | %D |
Author | author | %A |
EndPage | endpage | %$ |
Publisher | author_address | %+ |
Num | number | %N |
Name | journal | %J |
year | year | %D |
Reference Type | mark | %0 |
Abstract | abstract | %X |
BookID | accession_number | %M |
DOI | doi | %R |
Secondary Title | secondary_title | %B |
Notes | cn | %= |
Author Address | author_address | %+ |
Publisher | publisher | %I |
Nill | file | %> |
Nill | level | %1 |
Nill | notes | %Z |
Nill | editor | %E |
Nill | section | %& |
Nill | urldate | %[ |
Nill | class | %< |
Nill | short_title | %! |
Nill | tertiary_author | %Y |
Nill | edition | %7 |
Nill | department | %~ |
Nill | alternate_title | %O |
Nill | reprint_edition | %) |
Nill | original_publication | %( |
Nill | label | %F |
Nill | caption | %^ |
Nill | volumes_number | %6 |
表2 Noteexpress和BibTex文献类型对应关系
Noteexpress | BibTex |
---|---|
Book | book |
Paten | patent |
Legal Rule or Regulation | misc |
Journal Article | article |
Conference Proceedings | conference |
Thesis | phdthesis |
Newspaper Article | article |
Other Article | misc |
表3 Endnote和BibTex文献类型对应关系
Endnote | BibTex |
---|---|
Conference Paper | inproceedings |
Conference Proceedings | proceedings |
Journal Article | article |
Paten | patent |
Electronic Book | book |
Newspaper Article | article |
Unpublished Work | unpublished |
Electronic Article | article |
Book Section | incollection |
Magazine Article | article |
Book | book |
Thesis | phdthesis |
Edited Book | book |
图 1 软件GUI界面
讨论
混合编程是指使用两种或两种以上的程序设计语言来开发应用程序的过程。
自1954年美国约翰·贝克斯(John Backus)创造出了第一个高级语言Fortran语言,新的编程语言开始不断涌现。至今为止,编程语言已经达到600多种,但流行的程序设计语言最多二三十种,它们有各自的特点和擅长领域。
Pascal语言由瑞士Niklaus Wirth教授于六十年代末设计并创立,具有语法严谨、层次分明等特点,是第一个结构化编程语言,被称为“编程语言里一个重要的里程碑”。
Perl语言由拉里·沃尔(Larry Wall)于1987年12月18日发表。Perl是第一种后现代编程语言[11],最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN,像C一样强大,像awk、sed等脚本描述语言一样方便,即可以把简单工作简单化,同时又不失去处理困难问题能力。2015年12月25日,开发了十多年的Perl 6语言在圣诞节正式发布,并于2019年10月改名为Raku,以便于和Perl 5区分。
混合编程可以充分利用各种程序设计语言的优势,并被广泛应用各种各种场景,是未来编程的一个趋势。比如python语言涉及大量运算的时候总是调用C语言来实现。Perl 6使用Nativecall可以很方面执行C语言代码,还可以使用Inline::Python使用python生态和Inline::Perl使用Perl 5生态。
文献管理的主要工作是文本分析,这是perl语言最擅长的领域。Perl是Larry为了格式化处理文本而创建的,其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。Perl 6同样继承了Perl 5语言的优点。
文献管理任务需要菜单交互操作,对于终端用户,界面开发十分重要。Perl也支持界面开发,比如文献采集系统就是用Perl语言加Tk模块开发的,输入栏目可以用编程快速生成,但不适合建立复杂的GUI界面。
Delphi是Windows平台下著名的快速应用程序开发工具,其可视化编程环境可以快速生成具备优美界面的程序框架。Lazarus 与 Delphi 高度兼容,并被视作后者的开源替代品,能运行于Linux,Win32和Mac OS。Lazarus的编程语言是以Pascal为基础的。事实证明,Lazarus开发文献管理系统界面非常简便,而且软件界面支持快捷键操作菜单,通过TProcess可以极方便调用外部程序。Perl 程序可以直接调用,也可以使用pp模块进行编译和打包,适合调用完成复杂任务。如果需要保护源代码,可以使用PAR::Filter::Crypto 模块进行代码加密。系统还采用HTML文件作为文献报告格式,其内部的JavaScript语言能够完成复杂检索,适合网络发布。也能够以Excel格式生成报表。Lazarus具备“一次编写,到处编译”的特性,不需要重新编码就可以为不同的平台开发相同的产品,Perl语言也具备跨平台特性。
结论
基于混合编程技术的文献管理系统开发,利用了Lazarus快速界面开发和perl语言快捷文本处理的优势,能够提高程序开发效率,实现任务目标。
参考文献
-
张颖,刘敏.文献管理软件研究现状与对策分析[J].情报探索,2014(11):8-12. ↩
-
Oren Patashnik.BiB-TEXing[EB/OL].http://www.openoffice.org/bibliographic/btxdoc.html,1988-02-28/2020-02-18 ↩ ↩ ↩ ↩ ↩
-
Zeping Lee.GB/T 7714-2015 BibTEX style[EB/OL].http://mirrors.hust.edu.cn/CTAN/biblio/bibtex/contrib/gbt7714/gbt7714.pdf,2019-11-20/2020-02-18. ↩ ↩ ↩ ↩
-
李安邦,蒋效会.CvtEnw:中文文献著录项目直接导出到文献管理软件[J].现代情报,2010,30(09):160-162. ↩ ↩
-
中国国家标准化委员会.信息与文献参考文献著录规则:GB/T 7714—2015[S].北京:中国标准出版社,2015. ↩ ↩ ↩
-
文榕生. 新版参考文献著录规则求疵[J]. 山东图书馆学刊,2019(03):7-18. ↩
-
Patrick W. Daly.Natural Sciences Citations and References[EB/OL].https://mirrors.tuna.tsinghua.edu.cn/CTAN/macros/latex/contrib/natbib/natbib.pdf,2010-09-14/2020-02-18. ↩
-
Dominik Benz, Andreas Hotho, Robert Jäschke,etc. The social bookmark and publication management system bibsonomy[J]. Vldb Journal, 19(6):849-875. ↩
-
https://github.com/JabRef/EndNode-JabRef-filters,2020-02-18 ↩
-
杨晓凯.医院科研论文的自动化采集、分析和管理[J].医院管理论坛,2014,31(05):45-47+21. ↩
-
Larry Wall.Perl, the first postmodern computer language[EB/OL].https://www.perl.com/pub/1999/03/pm.html/,1999-06-09/2020-02-18. ↩