景文會 劉偉 黃炳程 覃興剛 任佳祺
收稿日期:2023-06-07
基金項目:2022年廣西壯族自治區(qū)區(qū)級大學生創(chuàng)新創(chuàng)業(yè)訓練計劃項目資助(S202210603152)
DOI:10.19850/j.cnki.2096-4706.2024.04.025
摘? 要:中國革命歷史數(shù)據(jù)蘊含豐富的歷史信息和文化價值,充分利用這些數(shù)據(jù)對傳承中華民族的優(yōu)秀傳統(tǒng)文化有重要意義。文章針對中國革命歷史數(shù)據(jù)預處理的問題,闡述了基于Python語言的中國革命歷史數(shù)據(jù)處理和分析的步驟和方法,介紹了中國革命歷史數(shù)據(jù)從文字圖片提取,到文字圖片的儲存處理,再到為數(shù)據(jù)中的人物和事件實體綁定鏈接的詳細流程。此外,項目還取得了大量中國革命歷史相關(guān)的文字數(shù)據(jù),并進行了文本預處理和分析,成功地實現(xiàn)了對中國革命歷史相關(guān)文本的知識圖譜的構(gòu)建。文章所提方法具有一定的實用性和優(yōu)越性,對于推進中國革命歷史的傳承和發(fā)展具有一定的參考價值。
關(guān)鍵詞:Python;中國革命歷史;數(shù)據(jù)處理
中圖分類號:TP391.1? 文獻標識碼:A? 文章編號:2096-4706(2024)04-0116-05
Research on Data Preprocessing Technology of Chinese Revolutionary History Knowledge Graph Based on Python Language
JING Wenhui, LIU Wei, HUANG Bingcheng, QIN Xinggang, REN Jiaqi
(School of Computer and Information Engineering, Nanning Normal University, Nanning? 530100, China)
Abstract: The historical data of the Chinese revolution contains rich historical information and cultural value, and fully utilizing these data is of great significance for inheriting the excellent traditional culture of the Chinese nation. This paper elaborates on the steps and methods of processing and analyzing Chinese revolutionary historical data based on Python language, focusing on the issue of preprocessing Chinese revolutionary historical data. It introduces the detailed process of Chinese revolutionary historical data from extracting text image, storing and processing text images, and then binding links for characters and event entities in the data. In addition, the project also obtained a large number of text data related to the history of the Chinese revolution, and carried out text preprocessing and analysis, successfully realizing the construction of the Knowledge Graph of the text related to the history of the Chinese revolution. The method proposed in the paper has certain practicality and superiority, and has certain reference value for promoting the inheritance and development of Chinese revolutionary history.
Keywords: Python; Chinese revolutionary history; data processing
0? 引? 言
中國革命精神是中華民族寶貴的精神財富,激勵了一代又一代中國人民為理想和信仰拼搏奮斗。了解中國革命歷史、研究中國革命歷史對中華民族的文化傳承具有重要意義。知識圖譜是將中國革命歷史知識數(shù)字化的有效工具。為了構(gòu)建中國革命歷史知識圖譜,需要從大量的中國革命歷史文檔資料中,抽取人物、地點、事件等實體。為了實現(xiàn)文字和圖片的關(guān)聯(lián)展示,需要將文檔資料中圖片和文字分離,按知識圖譜框架結(jié)構(gòu)將圖片和文字分別存儲及處理。本文將介紹基于Python技術(shù)的中國革命歷史知識圖譜構(gòu)建數(shù)據(jù)預處理過程。大概分為以下3個步驟:分離文檔中的文字和圖片;文字和圖片的存儲及實體識別處理;為人物和事件實體綁定百度百科的鏈接。下面將對3個步驟逐一詳細介紹。
1? 分離文檔中的文字和圖片
Python是一種強大的編程語言,可用于各種數(shù)據(jù)處理和文檔抽取任務,本文通過Python的Python-docx庫的write方法來提取Word文檔中的文本內(nèi)容和圖片內(nèi)容。文檔和圖片分離的流程圖如圖1所示。
首先使用Python-docx庫的write方法讀取Word文檔,判斷讀取到的文檔內(nèi)容,如果為段落標題,則調(diào)用paragraphs屬性獲取文檔的段落標題,并根據(jù)段落標題建立對應的文件夾。如果讀取到docx的正文部分則將分別用write方法來提取文字和圖片,并分別生成txt文件和圖片(如圖2(b)),以文檔名稱命名后寫入生成的文件夾中。
圖1? 文檔分離的流程圖
(a)Word文檔? ? ? ? ? ? ?(b)提取和分離效果
圖2? 文檔分離效果圖
其中圖2(a)是未處理的圖文混排Word文檔,圖2(b)則是經(jīng)過Python提取和分離過后的效果,最底層的文件夾以提取的段落標題命名。
2? 文字和圖片的存儲處理
2.1? 圖片存儲
本文采用MongoDB數(shù)據(jù)庫存儲圖片。存儲圖片的主要步驟為:
1)連接本地MongoDB數(shù)據(jù)庫。在名為“Redculture”的數(shù)據(jù)庫中創(chuàng)建一個名為“my_collection”的集合。具體代碼為:
from pymongo import MongoClient as MC
MClient = MC('localhost', 27017)? # 連接MongoDB
db = MClient['Redculture']? # 指定數(shù)據(jù)庫
collection = db['my_collection']
2)遍歷文件夾中的所有圖片并插入到集合中。首先使用Pillow庫打開圖像,再將圖像數(shù)據(jù)通過tobytes()方法轉(zhuǎn)換為二進制文件,最后將二進制文件通過insert_one方法(insert one方法是在pymong庫里,不需要定義可以直接使用)將二進制文件存入數(shù)據(jù)庫。具體代碼為:
for filename in os.listdir('/path/to/folder'):
if ilename.endswith('.jpg') or filename.endswith('.png'):with open(os.path.join('/path/to/folder', filename), 'rb') as f:
img = Image.open(f)
img_data = img.tobytes()
img_doc = {'filename': filename, 'data': img_data}
collection.insert_one(img_doc)
其中圖3(a)是存放在文件夾中的圖片,圖3(b)為圖片存放在MongoDB中的效果圖,其中id是集合中文件的鍵(圖片文件名),用于區(qū)分文件(記錄)。默認情況下,_id字段的類型為ObjectID,是MongoDB的BSON類型之一。data則是存儲圖片的二進制數(shù)據(jù),采用BinData形式,BinData提供了一種聲明性方式來讀取和寫入結(jié)構(gòu)化二進制數(shù)據(jù)
(a)文件夾中的圖片? ? ? ? ? ? ?(b)效果圖
圖3? 圖片存入MongoDB的效果圖
2.2? 文字存儲
文本數(shù)據(jù)存儲到MongoDB需要完成以下2個步驟:
1)連接MongoDB數(shù)據(jù)庫。連接MongoDB數(shù)據(jù)庫并選擇要存儲數(shù)據(jù)的集合,使用PyMongo庫連接到本地MongoDB實例,在名為“Redculture”的數(shù)據(jù)庫中創(chuàng)建一個名為“beijing”的集合。具體代碼為:
from pymongo import MongoClient as MC
client = MongoClient('mongodb://localhost:27017/')
db = client['Redculture ']
collection = db['beijing ']
2)打開文件夾并遍歷文件。使用Python內(nèi)置的os庫打開文件夾,并使用os.listdir()函數(shù)列出文件夾中的所有文件,再使用內(nèi)置的open()方法打開以txt為后綴的文件并讀取內(nèi)容,最后使用read()方法將讀取的內(nèi)容通過insert_one()方法存入到MongoDB數(shù)據(jù)庫中。具體代碼為:
fileList = 'C:/Users/winner/Desktop/bejing/'
for filelists in os.listdir(fileList):
for filelistslistinos.listdir(fileList + filelists):
for text_listinos.listdir(fileList + filelists + '/' + filelistslist):
if text_list.split('.')[1] != 'txt':
break
else:
dataSource = fileList + filelists + '/' + filelistslist + '/' +text_list
province = 'bejing'
with open(dataSource, 'r', encoding='utf-8') as f_text:
title_h3 = '
dataLines = f_text.read()
date_insert =dataLines.replace('\n', '')
collection.insert_one({'province': province, 'address': text_list.split('.')[0], 'content': title_h3+date_insert})
其中圖4(a)是存放在文件夾中的文本文件,圖4(b)是文本存入MongoDB的效果圖。其中id是集合中文件的鍵(文本文件名),用于區(qū)分文件(記錄)。默認情況下,_id字段的類型為ObjectID,是MongoDB的BSON類型之一。Content用于存儲文本提取出來的文本內(nèi)容。
(a)文本文件? ? ? ? ? ? ? ? (b)效果圖
圖4? 文字存入MongoDB的效果圖
3? 為人物和事件實體綁定百度百科的鏈接
3.1? 對txt文本進行分詞操作以獲取實體
提取文檔中的人名和歷史事件實體,是實現(xiàn)中國革命歷史知識圖譜必不可少的就環(huán)節(jié),由于近代戰(zhàn)爭中的歷史人物和事件,在百度百科中都有相關(guān)詞條,因此本文將采用將實體名鏈接到百度百科詞條的方式,來實現(xiàn)實體查詢的信息共享。
我們首先使用open函數(shù)讀取一個txt文件,然后遍歷內(nèi)容找到以“起義”“革命”和“運動”結(jié)尾的一段文字,這樣可以找到存在歷史事件的一段文字,后期再手動篩選其中的歷史事件。
接下來使用Python中的pyltp庫和shutil庫,實現(xiàn)對人名和地名的分詞,pyltp是一個用于自然語言處理的Python庫,它是LTP(Language Technology Platform)的Python接口,支持多種自然語言處理任務,如分詞、詞性標注、命名實體識別等。shutil是Python中的一個文件操作庫,可以用于復制、移動、重命名和刪除文件或目錄等操作。
1)連接pyltp分詞模型:
# pyltp模型目錄的路徑
LTP_DATA_DIR = '/path/to/ltp_data_v3.4.0'
# 分詞模型路徑,模型名稱為`cws.model`
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
# 初始化實例
segmentor.load(cws_model_path)
# 加載模型
segmentor = Segmentor()
2)遍歷文件夾中的所有文本文件,對每個文件進行分詞處理并保存到新文件:
# 遍歷文件夾中的所有文本文件
for filename in os.listdir('/path/to/folder'):
if filename.endswith('.txt'):
# 讀取文件內(nèi)容
with open(os.path.join('/path/to/folder', filename), 'r', encoding='utf-8') as f:
text = f.read()
# 進行分詞處理
words = segmentor.segment(text)
# 將分詞結(jié)果轉(zhuǎn)換為字符串
result = ' '.join(words)
# 保存分詞結(jié)果到新文件
new_filename = os.path.splitext(filename)[0] + '_seg.txt'
with open(os.path.join('/path/to/output/folder', new_filename), 'w', encoding='utf-8') as f:
f.write(result)
需要注意的是,在實際應用中,我們還可以對分詞結(jié)果進行過濾、去重、歸一化等操作,以便更好地提取文本信息和洞察數(shù)據(jù)趨勢。圖5(a)是存儲在txt中未分詞的文字,結(jié)合Python中的pyltp庫和shutil庫實現(xiàn)圖5(b)的效果,后期再手工過濾篩選出其中正確的人名。
(a)未分詞的txt文檔? ? ? ? (b)提取出人名的文檔
分詞效果圖
圖5? txt文本進行分詞效果圖
3.2? 為人物和事件實體綁定百度百科的鏈接
百度百科作為一個維基百科式的平臺,是中國最大的中文百科全書之一,其收錄了人物、歷史事件、地理位置、生物、科技、文化藝術(shù)等領(lǐng)域全面、權(quán)威、準確的知識。因此我們打算將人物和事件實體與百度百科鏈接相綁定,首先我們通過Python代碼讀取想要采集的人名和事件名稱,利用爬蟲技術(shù)獲取到百度百科鏈接的URL,將實體的URL鏈接與實體進行配對,最后將抓取到的鏈接存入Excel文件中去,以便后期的數(shù)據(jù)清洗。
3.2.1? 爬取實體的百度百科鏈接URL
近年來互聯(lián)網(wǎng)的發(fā)展速度是迅猛的,在龐大的網(wǎng)絡信息中,用戶們可以通過一定的手段獲取想要的知識,但是由于網(wǎng)絡上的信息眾多,想要獲取目標信息的難度卻很大,因此人們就需要一個工具。因此就有了搜索引擎,而網(wǎng)絡爬蟲正是搜索引擎的核心組成部分。
網(wǎng)絡爬蟲能夠?qū)W(wǎng)頁進行自動獲取。在本次數(shù)據(jù)處理過程中,我們需要找到人名和歷史事件的百度鏈接,面對如此龐大的數(shù)據(jù)工作量,我們決定使用網(wǎng)絡爬蟲技術(shù),來進行數(shù)據(jù)收集。為此我們采用谷歌的Chromedriver搭配Python代碼來實現(xiàn)百度鏈接抓取。利用運行已經(jīng)編輯好的代碼,對已經(jīng)提取出來的人名和事件(圖6(a))進行讀取。通過在百度百科中搜索讀取到的人名或事件名,將其鏈接進行抓取并存入Excel文件中,后期再經(jīng)過人工篩查,將無效數(shù)據(jù)刪除,進行數(shù)據(jù)清洗,從而得到一組干凈的數(shù)據(jù),圖6(b)是通過Python代碼抓取百度百科鏈接并存入Excel文件的效果圖。
(a)取出來的實體名? ?(b)存入Excel文件的效果圖
圖6? 數(shù)據(jù)收集、清洗樣例
3.2.2? 設置人物和事件實體的鏈接
經(jīng)過上一步的數(shù)據(jù)清洗后,我們得到了一組干凈的數(shù)據(jù)。本文選擇使用MongoDB數(shù)據(jù)庫進行數(shù)據(jù)存儲,首先通過網(wǎng)絡爬蟲得到帶有實體鏈接的Excel文件,如圖6所示,將Excel文件的鏈接寫回txt文本中,最后把帶有鏈接的實體的文本數(shù)據(jù)存入MongoDB數(shù)據(jù)庫中。通過這種存儲方式可以提高數(shù)據(jù)管理和查詢效率,方便數(shù)據(jù)存儲和共享,提高數(shù)據(jù)安全性和可靠性。
要實現(xiàn)Excel文件存入MongoDB數(shù)據(jù)庫,首先我們需要調(diào)用Python的pandas庫來讀取Excel文件里的內(nèi)容,再通過pymongo庫來連接MongoDB數(shù)據(jù)庫,再依次將文件里的實體及鏈接存入到MongoDB數(shù)據(jù)庫中。
1)連接MongoDB數(shù)據(jù)庫:
# 連接MongoDB數(shù)據(jù)庫
client = pymongo.MongoClient('localhost', 27017)
db = client['Redculture']
# 文件所在路徑
collection = db["cq"]#集合名(navicat里面生成的集合名)
2)讀取txt文件并將內(nèi)容存入到集合中:
# 讀取Excel文件
data = pd.read_excel('實體鏈接.xlsx')
# 將數(shù)據(jù)插入到MongoDB中
for index, row in data.iterrows():
name = row['姓名']
link = row['鏈接']
collection.insert_one({'姓名': name, '鏈接': link})
需要注意的是,在存儲過程中需要手動將client值的設置改為需要存入的數(shù)據(jù)庫名稱,不然會造成存入數(shù)據(jù)混亂、后期管理不方便的問題。最終得到的紅色文化有關(guān)數(shù)據(jù)庫的可視化局部效果圖,如圖7所示。
4? 結(jié)? 論
Python語言語法簡單清晰,具備豐富的標準庫和第三方庫,功能強大且免費使用,利用Python語言進行數(shù)據(jù)分析處理十分靈活和高效。本文主要是利用Python語言對中國革命歷史知識文化數(shù)據(jù)進行處理,主要可分為3個步驟:提取文檔中的文字和圖片,對文字和圖片進行存儲處理,為人物和事件實體綁定百度百科的鏈接并將最終數(shù)據(jù)存入MongoDB數(shù)據(jù)庫。文章通過實例講解了中國革命歷史文化知識數(shù)據(jù)處理過程中各個步驟的可行性,最終得到紅色文化有關(guān)數(shù)據(jù)庫的可視化局部效果圖。希望能為類似的技術(shù)研究和功能開發(fā)提供借鑒。
參考文獻:
[1] 沈成飛,連文妹.論紅色文化的內(nèi)涵、特征及其當代價值 [J].教學與研究,2018(1):97-104.
[2] 周宿峰. 紅色文化基本問題研究 [D].長春:吉林大學,2014.
[3] 朱志強,林嵐,楊書,等.國內(nèi)紅色旅游研究發(fā)展知識圖譜——基于CiteSpace的計量分析 [J].旅游論壇,2016,9(6):32-39.
[4] XIE R B,LIU Z Y,JIA J,et al.Representation Learning of Knowledge Graphs with Entity Descriptions [C]//Proceedings of the Thirtieth AAAI Conference on Artificial Intelligence.Phoenix:AAAI Press,2016:2659-2665.
[5] RATNAPARKHI A.A Maximum Entropy Model for Part-Of-Speech Tagging [EB/OL].[2023-05-20].http://www.delph-in.net/courses/07/nlp/Ratnaparkhi%3a96.pdf.
[6] MCCALLUM A,F(xiàn)REITAG D,PEREIRA F C N.Maximum Entropy Markov Models for Information Extraction and Segmentation [C]//Proceedings of the Seventeenth International Conference on Machine Learning.San Francisco:Morgan Kaufmann Publishers Inc,2000,17:591-598.
[7] AUGENSTEIN I,RUDER S,S?GAARD A. Multi-task Learning of Pairwise Sequence Classification Tasks Over Disparate Label Spaces [J/OL].arXiv:1802.09913 [cs.CL].[2023-05-20].https://arxiv.org/abs/1802.09913.
[8] BERYOZKIN G ,DRORI Y,GILON O,et al. A Joint Named-Entity Recognizer for Heterogeneous Tag-setsUsing a Tag Hierarchy [J/OL].arXiv:1905.09135 [cs.CL].[2023-05-16].https://arxiv.org/abs/1905.09135v1.
[9] HUANG Z H,XU WEI,YU KAI. Bidirectional LSTM-CRF Models for Sequence Tagging [J/OL].arXiv:1508.01991 [cs.CL].[2023-05-16].https://arxiv.org/abs/1508.01991.
[10] MAO MINGYI,WU CHEN,ZHONG YIXIN,et al. BERT named entity recognition model with self-attention mechanism [J].CAAI Transactions on Intelligent Systems,2020,15(4):772–779.
[11] YANG H Q. BERT Meets Chinese Word Segmentation [J/OL].arXiv:1909.09292 [cs.CL].[2023-05-16].https://doi.org/10.48550/arXiv.1909.09292.
作者簡介:景文會(2002—),女,仡佬族,貴州銅
仁人,本科在讀,主要研究方向:自然語言處理;劉偉(2001—),男,土家族,貴州銅仁人,本科在讀,主要研究方向:自然語言處理;黃炳程(2001—),男,壯族,廣西欽州人,本科在讀,主要研究方向:自然語言處理;覃興剛(2001—),男,壯族,廣西興業(yè)人,本科在讀,主要研究方向:自然語言處理;任佳祺(2002—),男,漢族,山東威海人,本科在讀,主要研究方向:自然語言處理。