全唐詩文字語料在「全唐詩.txt」檔案中,請參考語料閱讀以下內容。我們計畫將《全唐詩》中的每一首詩的各種資訊分別提取出來,並轉存為csv的形式。根據對文字的初步了解,我們發現我們需要提取的資訊(即絕大部分詩文都包含的共性資訊)包括:
雖然有的詩並沒有作者(例如卷899_19),但是在整體結構設計的時候不用考慮它們。
在了解文字的過程中,主要圍繞需要提取的資訊的形式;通過了解文字,我們基本上得到可以解析大部分文字內容的規律性方法。
卷25_7【雜曲歌辭·俠客行】
李白趙客縵胡纓,吳鉤霜雪明。銀鞍照白馬,颯沓如流星。
十步殺一人,千里不留行。事了拂衣去,深藏身與名。
閒過信陵飲,脫劍膝前橫。將炙啖朱亥,持觴勸侯嬴。
三杯吐然諾,五岳倒為輕。眼花耳熱後,意氣素霓生。
救趙揮金槌,邯鄲先震驚。千秋二壯士,烜赫大樑城。
縱死俠骨香,不慚世上英。誰能書閣下,白首太玄經。
卷106_7 【送金城公主適西蕃應制】鄭愔
下嫁戎庭遠,和親漢禮優。笳聲出虜塞,簫曲背秦樓。
貴主悲黃鶴,徵人怨紫騮。皇情眷億兆,割念俯懷柔。主
首先,通過了解我們發現每首詩的形式,都類似以上的形式。以乙個標題行開始,標題行中基本上都包括卷編號和詩編號(卷[0-9]+_[0-9]+
)和標題(【[^】]+】
)兩部分,有的時候也會包含作者名。因此,我們可以以標題行為標誌,一旦發現標題行,就認為一首詩的內容已經結束,下一首詩的內容即將開始(即完成一首詩的整理)。
接著,通過仔細觀察,我們發現標題行、詩文中偶爾會有多餘的空格(包括半形或全形)出現,在詩文末尾還會有校注者知古齋主的標註。因此,對每一行我們需要進行初步的清洗,包括移除空格、換行符和校注者的標註((?<=[),。])[知古齋主]$
)。
至此,我們已經可以提取出卷編號、詩編號、標題、內容這四部分,但是作者部分仍然存在一些問題。經過進一步的觀察,我們發現當作者位於標題行時,作者名是除了卷編號、詩編號、標題以外的唯一的中文內容;當作者名存在於標題行之後的某一行中時,該行為不包含任何標點符號的一行。
此外,我們發現,卷的標題(「第一百六十三卷」、「卷一百六十四」等)、版權資訊等內容也是非詩文的無效內容,我們也需要通過正規表示式等方法過濾掉它們。
在對文字初步了解的基礎上,我們可以實現對文字的解析。整體邏輯結構如下:按行遍歷文字語料;若該行為標題行,則解析當前詩作資訊;若該行非標題行,則將當前行的內容存入當前詩作的內容中。
在遍歷的過程中,我們需要對各行的文字語料進行清洗,並過濾空行、無效行等。
在解析過程中,我們可以將解析的結果儲存到list中,list中的每個元素為一首詩,每個元素包括卷編號、詩編號、標題、作者、內容五個屬性。
讀取文字語料
首先,按行讀取txt格式的《全唐詩》文字語料。
with
open
("全唐詩.txt"
, encoding=
"utf-8")as
file
: lines =
file
.readlines(
)print
("總行數:"
,len
(lines)
)
清洗文字語料
對每一行都進行的文字清洗:
line = line.replace(
"\n",""
).replace(
" ","")
.replace(
" ","")
line = re.sub(
"卷[一二三四五六七**十百]+",""
, line)
line = re.sub(
"第[一二三四五六七**十百]+卷",""
, line)
僅對文字內容行進行的文字清洗:
line = line.replace(
"¤",
"。")
# 將錯誤句號替換為標準句號
line = re.sub(
"(?<=[),。])[知古齋主]$",""
, line)
# 剔除校注者名稱
過濾無效行(先文字清洗再過濾無效行,一遍將「第一百六十三卷」等過濾掉):
if
"知古齋主精校"
in line or
in line or
in line:
continue
文字語料解析
在標題行中提取卷編號(python 3.8+):
if book_regex :
= re.search(
"(?<=卷)[0-9]+(?=_)"
, line)
: book_num =
int(book_regex.group())
# 讀取卷編號
在標題行中提取詩編號(python 3.8+):
if poem_regex :
= re.search(
"(?<=_)[0-9]+"
, line)
: poem_num =
int(poem_regex.group())
# 讀取詩編號
在標題行中提取標題(python 3.8+):
if title_regex := re.search("(?<=【)[^】]+(?=】)", line):
title = title_regex.group() # 讀取標題
在標題行中嘗試提取作者(python 3.8+):
line = re.sub(
"卷[0-9]+_[0-9]+",""
, line)
line = re.sub(
"【[^】]+】",""
, line)
if author_regex :
= re.search(
"[\u4e00-\u9fa5]+"
, line)
: author = author_regex.group(
)# 如果作者名位於標題行,則為清除其他所有內容後剩餘的中文
if
not re.search(
"[,。?!]"
, line)
: author_regex = re.search(
"[\u4e00-\u9fa5]+"
, line)
author = author_regex.group(
)
非標題行中的內容在清洗之後直接新增到詩文的內容中即可。
在文字解析完成後,我們可以將儲存在list中的臨時資料儲存到檔案中。
with
open
("全唐詩(清洗後).txt"
,"w+"
, encoding=
"utf-8")as
file
:for poem_item in poem_list:
file
.write(
",".join(
[str
(poem_item[
"卷編號"])
,str
(poem_item[
"詩編號"])
, poem_item[
"標題"
], poem_item[
"作者"],
poem_item[
"內容"]]
)+"\n"
)
完整源**
python,文字分析
記得將當前目錄設定為檔案目錄 spyder編譯器的右上角,本人用spyder filename input 請輸入你的檔名 file open filename txt try for eachline in file print eachline except print 開啟檔案出錯 final...
Python資料分析整理
成都找了份實習工作,之前本來是打算先熟悉下spss的使用,但是公司要分析的基本是百萬左右的資料,於是邊學習邊整理下資料吧。重新把 機器學習實戰 裡面的東西過一遍,和資料基本都是書上的,同時也加了些自己的 python 3.7.6 sklearn 0.0 pandas 1.0.5 matplotlib...
基於Python的情感分析案例
情感極性分析的目的是對文字進行褒義 貶義 中性的判斷。在大多應用場景下,只分為兩類。例如對於 喜愛 和 厭惡 這兩個詞,就屬於不同的情感傾向。示例1 好評 示例2 差評 讀取文字檔案 def text f1 open e 工作檔案 情感分析案例1 good.txt r encoding utf 8 ...