準(zhǔn)備步驟
安裝python3,下載CSDB,任意選擇位置git clone ...
環(huán)境配置
- 在
pycharm中,command+,選擇interpreter,create virtualenv,選擇python版本,location自己定(之后安裝的庫都是在這個(gè)文件夾里),和程序文件所在位置無關(guān)。 - 在終端中,定位到virtualenv所在位置,
source bin/activate,激活,可看到(lenv)前綴。可用pip命令安裝各種庫。 - 回到
pycharm中,仍然選擇剛才創(chuàng)建的virtualenv,可看到多了剛才安裝的庫。
db文件
用sqlite3 filename打開,有.help、.table等命令。
word_level_analyzer.py
文件前加:# coding:utf-8
在函數(shù)cut_qts_to_words中,有如下變量:
char_counter = Counter() # 字頻統(tǒng)計(jì)
author_counter = Counter() # 每個(gè)作者的寫詩篇數(shù)
vocab = set() # 詞匯庫
word_counter = Counter() # 詞頻統(tǒng)計(jì)
genre_counter = defaultdict(Counter) # 針對每個(gè)詞性的Counter
- 源文件格式為
num+author+poet,用list區(qū)分即可,統(tǒng)計(jì)作者、漢子個(gè)數(shù); - 用
thulac庫中的lex_analyzer.cut分割詞語和對應(yīng)的詞性,記錄下來,邊統(tǒng)計(jì)邊輸出進(jìn)展。
分詞后輸出文檔如下(只選取了一首詩,詩的末尾不能有轉(zhuǎn)折,否則程序會出錯(cuò)):qts_words_list - 用
gensim中的Word2Vec得到詞向量; - 打印結(jié)果,按序輸出語句為:
print_counter(author_counter.most_common(10)),counter格式能自動選取頻率最高的打印出來。
construct_poets_network.py
- 調(diào)用
utils.py函數(shù)讀取作者和詩歌內(nèi)容。由于不用進(jìn)行詞法分析,速度快。 - 用CSDB來確定作者(
def get_alter_names)。打開.db文件:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
識別作者有兩個(gè)問題:
- 重名
解決方法:首先用詩人名字在.db的BLOG_MAIN中查找:
cursor.execute('SELECT c_personid, c_birthyear, c_deathyear FROM BIOG_MAIN WHERE c_name_chn LIKE?', (author_pattern,))
# 記錄該人的生卒年和ID信息
person_info_list = cursor.fetchall()
如果候選人列表中的某人生卒年和唐朝重合,則確定此人就是要找的人。
- 別稱
由于有的作者別稱也是日常用詞,因此刪除這些別稱。
-
def get_refer_relations計(jì)算關(guān)系
for 從CSDB中統(tǒng)計(jì)出的詩人
for 每一首從qts中統(tǒng)計(jì)出詩歌
if該詩歌作者不在CSDB中跳過
查找該詩人的名字(包括所有別稱)
保存在reference_relations.pkl中。
visualize_poets_network.py
三個(gè)函數(shù):
- 得到排名靠前的關(guān)系
def get_concerned_relations_by_range - 通過已有的不同時(shí)期唐詩人名單,計(jì)算之間的關(guān)系
get_concerned_relations_by_authors - 畫圖
generate_html_page
//得到link數(shù)據(jù)
filtered_authors.add(refered_by)
filtered_authors.add(refered)
count = math.sqrt(count)
line_width = min_link_width + width_slope * (count - min_refer_count)
links_text += links_item_format % (refered_by, refered, line_width)
//處理節(jié)點(diǎn)數(shù)據(jù)
//和已經(jīng)寫好的`html`頭尾合并
展示圖如下:

盛唐詩人關(guān)系圖
