景文會 劉偉 黃炳程 覃興剛 任佳祺



收稿日期:2023-06-07
基金項目:2022年廣西壯族自治區區級大學生創新創業訓練計劃項目資助(S202210603152)
DOI:10.19850/j.cnki.2096-4706.2024.04.025
摘? 要:中國革命歷史數據蘊含豐富的歷史信息和文化價值,充分利用這些數據對傳承中華民族的優秀傳統文化有重要意義。文章針對中國革命歷史數據預處理的問題,闡述了基于Python語言的中國革命歷史數據處理和分析的步驟和方法,介紹了中國革命歷史數據從文字圖片提取,到文字圖片的儲存處理,再到為數據中的人物和事件實體綁定鏈接的詳細流程。此外,項目還取得了大量中國革命歷史相關的文字數據,并進行了文本預處理和分析,成功地實現了對中國革命歷史相關文本的知識圖譜的構建。文章所提方法具有一定的實用性和優越性,對于推進中國革命歷史的傳承和發展具有一定的參考價值。
關鍵詞:Python;中國革命歷史;數據處理
中圖分類號: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? 引? 言
中國革命精神是中華民族寶貴的精神財富,激勵了一代又一代中國人民為理想和信仰拼搏奮斗。了解中國革命歷史、研究中國革命歷史對中華民族的文化傳承具有重要意義。知識圖譜是將中國革命歷史知識數字化的有效工具。為了構建中國革命歷史知識圖譜,需要從大量的中國革命歷史文檔資料中,抽取人物、地點、事件等實體。為了實現文字和圖片的關聯展示,需要將文檔資料中圖片和文字分離,按知識圖譜框架結構將圖片和文字分別存儲及處理。本文將介紹基于Python技術的中國革命歷史知識圖譜構建數據預處理過程。大概分為以下3個步驟:分離文檔中的文字和圖片;文字和圖片的存儲及實體識別處理;為人物和事件實體綁定百度百科的鏈接。下面將對3個步驟逐一詳細介紹。
1? 分離文檔中的文字和圖片
Python是一種強大的編程語言,可用于各種數據處理和文檔抽取任務,本文通過Python的Python-docx庫的write方法來提取Word文檔中的文本內容和圖片內容。文檔和圖片分離的流程圖如圖1所示。
首先使用Python-docx庫的write方法讀取Word文檔,判斷讀取到的文檔內容,如果為段落標題,則調用paragraphs屬性獲取文檔的段落標題,并根據段落標題建立對應的文件夾。如果讀取到docx的正文部分則將分別用write方法來提取文字和圖片,并分別生成txt文件和圖片(如圖2(b)),以文檔名稱命名后寫入生成的文件夾中。
圖1? 文檔分離的流程圖
(a)Word文檔? ? ? ? ? ? ?(b)提取和分離效果
圖2? 文檔分離效果圖
其中圖2(a)是未處理的圖文混排Word文檔,圖2(b)則是經過Python提取和分離過后的效果,最底層的文件夾以提取的段落標題命名。
2? 文字和圖片的存儲處理
2.1? 圖片存儲
本文采用MongoDB數據庫存儲圖片。存儲圖片的主要步驟為:
1)連接本地MongoDB數據庫。在名為“Redculture”的數據庫中創建一個名為“my_collection”的集合。具體代碼為:
from pymongo import MongoClient as MC
MClient = MC('localhost', 27017)? # 連接MongoDB
db = MClient['Redculture']? # 指定數據庫
collection = db['my_collection']
2)遍歷文件夾中的所有圖片并插入到集合中。首先使用Pillow庫打開圖像,再將圖像數據通過tobytes()方法轉換為二進制文件,最后將二進制文件通過insert_one方法(insert one方法是在pymong庫里,不需要定義可以直接使用)將二進制文件存入數據庫。具體代碼為:
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是集合中文件的鍵(圖片文件名),用于區分文件(記錄)。默認情況下,_id字段的類型為ObjectID,是MongoDB的BSON類型之一。data則是存儲圖片的二進制數據,采用BinData形式,BinData提供了一種聲明性方式來讀取和寫入結構化二進制數據
(a)文件夾中的圖片? ? ? ? ? ? ?(b)效果圖
圖3? 圖片存入MongoDB的效果圖
2.2? 文字存儲
文本數據存儲到MongoDB需要完成以下2個步驟:
1)連接MongoDB數據庫。連接MongoDB數據庫并選擇要存儲數據的集合,使用PyMongo庫連接到本地MongoDB實例,在名為“Redculture”的數據庫中創建一個名為“beijing”的集合。具體代碼為:
from pymongo import MongoClient as MC
client = MongoClient('mongodb://localhost:27017/')
db = client['Redculture ']
collection = db['beijing ']
2)打開文件夾并遍歷文件。使用Python內置的os庫打開文件夾,并使用os.listdir()函數列出文件夾中的所有文件,再使用內置的open()方法打開以txt為后綴的文件并讀取內容,最后使用read()方法將讀取的內容通過insert_one()方法存入到MongoDB數據庫中。具體代碼為:
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是集合中文件的鍵(文本文件名),用于區分文件(記錄)。默認情況下,_id字段的類型為ObjectID,是MongoDB的BSON類型之一。Content用于存儲文本提取出來的文本內容。
(a)文本文件? ? ? ? ? ? ? ? (b)效果圖
圖4? 文字存入MongoDB的效果圖
3? 為人物和事件實體綁定百度百科的鏈接
3.1? 對txt文本進行分詞操作以獲取實體
提取文檔中的人名和歷史事件實體,是實現中國革命歷史知識圖譜必不可少的就環節,由于近代戰爭中的歷史人物和事件,在百度百科中都有相關詞條,因此本文將采用將實體名鏈接到百度百科詞條的方式,來實現實體查詢的信息共享。
我們首先使用open函數讀取一個txt文件,然后遍歷內容找到以“起義”“革命”和“運動”結尾的一段文字,這樣可以找到存在歷史事件的一段文字,后期再手動篩選其中的歷史事件。
接下來使用Python中的pyltp庫和shutil庫,實現對人名和地名的分詞,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'):
# 讀取文件內容
with open(os.path.join('/path/to/folder', filename), 'r', encoding='utf-8') as f:
text = f.read()
# 進行分詞處理
words = segmentor.segment(text)
# 將分詞結果轉換為字符串
result = ' '.join(words)
# 保存分詞結果到新文件
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)
需要注意的是,在實際應用中,我們還可以對分詞結果進行過濾、去重、歸一化等操作,以便更好地提取文本信息和洞察數據趨勢。圖5(a)是存儲在txt中未分詞的文字,結合Python中的pyltp庫和shutil庫實現圖5(b)的效果,后期再手工過濾篩選出其中正確的人名。
(a)未分詞的txt文檔? ? ? ? (b)提取出人名的文檔
分詞效果圖
圖5? txt文本進行分詞效果圖
3.2? 為人物和事件實體綁定百度百科的鏈接
百度百科作為一個維基百科式的平臺,是中國最大的中文百科全書之一,其收錄了人物、歷史事件、地理位置、生物、科技、文化藝術等領域全面、權威、準確的知識。因此我們打算將人物和事件實體與百度百科鏈接相綁定,首先我們通過Python代碼讀取想要采集的人名和事件名稱,利用爬蟲技術獲取到百度百科鏈接的URL,將實體的URL鏈接與實體進行配對,最后將抓取到的鏈接存入Excel文件中去,以便后期的數據清洗。
3.2.1? 爬取實體的百度百科鏈接URL
近年來互聯網的發展速度是迅猛的,在龐大的網絡信息中,用戶們可以通過一定的手段獲取想要的知識,但是由于網絡上的信息眾多,想要獲取目標信息的難度卻很大,因此人們就需要一個工具。因此就有了搜索引擎,而網絡爬蟲正是搜索引擎的核心組成部分。
網絡爬蟲能夠對網頁進行自動獲取。在本次數據處理過程中,我們需要找到人名和歷史事件的百度鏈接,面對如此龐大的數據工作量,我們決定使用網絡爬蟲技術,來進行數據收集。為此我們采用谷歌的Chromedriver搭配Python代碼來實現百度鏈接抓取。利用運行已經編輯好的代碼,對已經提取出來的人名和事件(圖6(a))進行讀取。通過在百度百科中搜索讀取到的人名或事件名,將其鏈接進行抓取并存入Excel文件中,后期再經過人工篩查,將無效數據刪除,進行數據清洗,從而得到一組干凈的數據,圖6(b)是通過Python代碼抓取百度百科鏈接并存入Excel文件的效果圖。
(a)取出來的實體名? ?(b)存入Excel文件的效果圖
圖6? 數據收集、清洗樣例
3.2.2? 設置人物和事件實體的鏈接
經過上一步的數據清洗后,我們得到了一組干凈的數據。本文選擇使用MongoDB數據庫進行數據存儲,首先通過網絡爬蟲得到帶有實體鏈接的Excel文件,如圖6所示,將Excel文件的鏈接寫回txt文本中,最后把帶有鏈接的實體的文本數據存入MongoDB數據庫中。通過這種存儲方式可以提高數據管理和查詢效率,方便數據存儲和共享,提高數據安全性和可靠性。
要實現Excel文件存入MongoDB數據庫,首先我們需要調用Python的pandas庫來讀取Excel文件里的內容,再通過pymongo庫來連接MongoDB數據庫,再依次將文件里的實體及鏈接存入到MongoDB數據庫中。
1)連接MongoDB數據庫:
# 連接MongoDB數據庫
client = pymongo.MongoClient('localhost', 27017)
db = client['Redculture']
# 文件所在路徑
collection = db["cq"]#集合名(navicat里面生成的集合名)
2)讀取txt文件并將內容存入到集合中:
# 讀取Excel文件
data = pd.read_excel('實體鏈接.xlsx')
# 將數據插入到MongoDB中
for index, row in data.iterrows():
name = row['姓名']
link = row['鏈接']
collection.insert_one({'姓名': name, '鏈接': link})
需要注意的是,在存儲過程中需要手動將client值的設置改為需要存入的數據庫名稱,不然會造成存入數據混亂、后期管理不方便的問題。最終得到的紅色文化有關數據庫的可視化局部效果圖,如圖7所示。
4? 結? 論
Python語言語法簡單清晰,具備豐富的標準庫和第三方庫,功能強大且免費使用,利用Python語言進行數據分析處理十分靈活和高效。本文主要是利用Python語言對中國革命歷史知識文化數據進行處理,主要可分為3個步驟:提取文檔中的文字和圖片,對文字和圖片進行存儲處理,為人物和事件實體綁定百度百科的鏈接并將最終數據存入MongoDB數據庫。文章通過實例講解了中國革命歷史文化知識數據處理過程中各個步驟的可行性,最終得到紅色文化有關數據庫的可視化局部效果圖。希望能為類似的技術研究和功能開發提供借鑒。
參考文獻:
[1] 沈成飛,連文妹.論紅色文化的內涵、特征及其當代價值 [J].教學與研究,2018(1):97-104.
[2] 周宿峰. 紅色文化基本問題研究 [D].長春:吉林大學,2014.
[3] 朱志強,林嵐,楊書,等.國內紅色旅游研究發展知識圖譜——基于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,FREITAG 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—),男,壯族,廣西興業人,本科在讀,主要研究方向:自然語言處理;任佳祺(2002—),男,漢族,山東威海人,本科在讀,主要研究方向:自然語言處理。