楊曉凱
溫州醫科大學溫州市第三臨床學院/溫州市人民醫院
【摘要】目的 基于混合編程技術,使用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)。
著錄項目分析
不同文獻類型的著錄項目信息范圍有所不同?!禛B/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. ?