柴源
(西安航空學(xué)院 圖書館, 陜西 西安 710077)
問答系統(tǒng)是接收用戶的自然語(yǔ)言問題,向用戶返回答案的對(duì)話系統(tǒng)[1],能夠提升規(guī)律性情景交互效率。圖書館參考咨詢業(yè)務(wù)具有極強(qiáng)的重復(fù)性和規(guī)律性,問答系統(tǒng)在該場(chǎng)景下能夠提升咨詢服務(wù)的效能。
1.1.1 圖書館參考咨詢數(shù)據(jù)繁多
隨著課程支持、學(xué)習(xí)支持、科研支持等的不斷出現(xiàn),傳統(tǒng)參考咨詢服務(wù)的內(nèi)容不斷細(xì)化。加之,現(xiàn)代信息技術(shù)的發(fā)展,QQ、微信等逐漸成為主要的咨詢渠道,參考咨詢服務(wù)的即時(shí)性和個(gè)性化要求越來越高。此背景下,具有重復(fù)性和規(guī)律性的參考咨詢數(shù)據(jù)越來越多。
1.1.2 傳統(tǒng)問答系統(tǒng)的不足
傳統(tǒng)問答系統(tǒng)是基于正向索引模式,即當(dāng)讀者在搜索某一關(guān)鍵詞時(shí),系統(tǒng)就需要掃描索引庫(kù)中的所有文檔,找出所有包含相關(guān)關(guān)鍵詞的文檔,再根據(jù)打分模型進(jìn)行打分,排出名次后呈現(xiàn)給用戶[2]。大數(shù)據(jù)時(shí)代,文檔的數(shù)目越來越多,這樣的索引結(jié)構(gòu)無法滿足實(shí)時(shí)返回排名結(jié)果的要求。
在問答系統(tǒng)實(shí)際的應(yīng)用中,為了通過關(guān)鍵詞的某些值查找記錄,就必須按照關(guān)鍵詞建立索引,稱作倒排索引[3]。帶有倒排索引的文件稱作倒排索引文件(也稱倒排文件),倒排文件中的次關(guān)鍵字索引稱作倒排表[4],如圖1所示。

圖1 倒排表
在處理復(fù)雜得多關(guān)鍵詞查詢時(shí),可在倒排表中先完成查詢的交、并等邏輯運(yùn)算,得到結(jié)果后再對(duì)記錄進(jìn)行存取。這樣不必對(duì)每個(gè)記錄隨機(jī)存取,把對(duì)記錄的查詢轉(zhuǎn)換為地址集合的運(yùn)算,從而提高查找效率。
基于倒排表的圖書館知識(shí)問答系統(tǒng)總體設(shè)計(jì)主要包括語(yǔ)料庫(kù)數(shù)據(jù)預(yù)處理,形成倒排表;用戶數(shù)據(jù)預(yù)處理,與倒排表進(jìn)行匹配,找到所有問題ID;將用戶所提問題和找到的問題進(jìn)行相似度計(jì)算,并輸出結(jié)果,如圖2所示。

圖2 系統(tǒng)結(jié)構(gòu)圖
2.2.1 語(yǔ)料庫(kù)收集與預(yù)處理
信息技術(shù)智能化、需求個(gè)性化,造成圖書館參考咨詢數(shù)據(jù)日益繁多,通過各種手段收集、整理并形成語(yǔ)料庫(kù)是最基礎(chǔ)、最重要的任務(wù)。對(duì)于電話、面對(duì)面等形式的咨詢,可以通過建立咨詢服務(wù)清單,及時(shí)將數(shù)據(jù)進(jìn)行分類歸檔;對(duì)于微信、QQ等新媒體數(shù)據(jù),可以通過編寫網(wǎng)絡(luò)爬蟲進(jìn)行抓取。語(yǔ)料庫(kù)一般由問題、答案兩部分組成,以列表的形式存儲(chǔ)。
語(yǔ)料庫(kù)預(yù)處理中,綜合《中文停用詞表》《哈工大停用詞表》《百度停用詞表》《四川大學(xué)機(jī)器智能實(shí)驗(yàn)室停用詞庫(kù)》建立停用詞表(stopwords);根據(jù)各圖書館的實(shí)際情況,建立用戶詞典(userdict)?;诖?,應(yīng)用jieba分詞工具進(jìn)行分詞,并過濾掉標(biāo)點(diǎn)符號(hào)、單字詞等。
2.2.2 建立倒排表
在語(yǔ)料庫(kù)數(shù)據(jù)預(yù)處理的基礎(chǔ)上,形成原始索引,如{‘問題1ID’:[關(guān)鍵詞1,關(guān)鍵詞2…],‘問題2ID’:[關(guān)鍵詞2,關(guān)鍵詞3…]…}。其中,ID為問題1所在的行數(shù),即問題1為第一個(gè)問題,ID為1。因?yàn)樾枰獙⒂脩籼岢龅膯栴}和庫(kù)里的問題進(jìn)行相似度計(jì)算,然后返回相似度高的問題答案。如果遍歷庫(kù)里的每一個(gè)問題,然后和用戶提出的問題做相似度計(jì)算,數(shù)據(jù)量大,時(shí)間成本太大。因此,處理后的倒排索引為{‘關(guān)鍵詞1’:[問題1ID],‘關(guān)鍵詞2’:[問題1ID,問題2ID…}。
2.2.3 用戶數(shù)據(jù)預(yù)處理及問題匹配
對(duì)用戶提的問題,首先分詞,找到問題的關(guān)鍵詞。然后根據(jù)關(guān)鍵詞,找到包含該關(guān)鍵詞的所有問題ID。
2.2.4 相似度計(jì)算及結(jié)果輸出
余弦相似度是通過計(jì)算兩個(gè)向量的夾角余弦值來評(píng)估他們的相似度[5],對(duì)于兩個(gè)向量,即空間中從原點(diǎn)([0, 0,…])出發(fā),指向不同方向的兩條線段,兩條線段之間形成一個(gè)夾角:如果夾角為0度,則意味著方向相同、線段重合;如果夾角為90度,意味著形成直角,方向完全不相似;如果夾角為180度,意味著方向正好相反。因此,可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。對(duì)n維向量A,B,假設(shè)A=[A1,A2,…,An],B=[B1,B2,…,Bn],則A與B的夾角θ的余弦等于式(1)。
(1)
余弦值的范圍在[-1,1]之間,值越趨近于1,代表兩個(gè)向量的方向越接近;越趨近于-1,他們的方向越相反;接近于0,表示兩個(gè)向量近乎于正交[6]。一般情況下,相似度都是歸一化到[0,1]區(qū)間內(nèi),因此余弦相似度表示為cosine_similarity=0.5cosθ+0.5。
研究中,將包含用戶問題關(guān)鍵詞的問題和2.2.3中的問題當(dāng)作兩個(gè)向量,進(jìn)行相似度計(jì)算,并輸出相似度最高的2個(gè)問題答案。
3.1.1 語(yǔ)料庫(kù)收集
西安航空學(xué)院圖書館參考咨詢數(shù)據(jù)主要來自規(guī)章制度、微信、QQ、日常參考咨詢服務(wù)清單。文章利用Python編寫網(wǎng)絡(luò)爬蟲工具,抓取微信、QQ等工具中的問答數(shù)據(jù),日常參考咨詢服務(wù)清單、規(guī)章制度的數(shù)據(jù)可直接應(yīng)用,分析發(fā)現(xiàn),主要包括學(xué)習(xí)類、科研類、教學(xué)類和生活類。部分實(shí)驗(yàn)數(shù)據(jù)(file_text)如表1所示。
3.1.2 數(shù)據(jù)預(yù)處理
文章根據(jù)西安航空學(xué)院圖書館日常工作需要,建立用戶詞典,包括閱讀學(xué)分、通借通還、文獻(xiàn)傳遞、新書庫(kù)等296個(gè)詞語(yǔ);定義函數(shù),刪除除字母、數(shù)字、漢字以外的所有符號(hào)和單字詞;加載2.2.1節(jié)中的停用詞表,過濾停用詞。應(yīng)用jieba工具對(duì)表1的“問題”進(jìn)行分詞,形成“cut_review”文件,部分結(jié)果如表2所示。
將表2中的數(shù)據(jù)進(jìn)行重新排序,即將含有同一關(guān)鍵詞的問題歸為一組,形成{<關(guān)鍵詞>,<文檔1編號(hào),文檔2編號(hào),文檔3編號(hào)…….>}的倒排表,執(zhí)行程序如下。
result={}
for i in range(len(file_txt)):
left, rights = i,file_txt.iloc[i]['cut_review'].split()
for right in rights:
if right in result.keys():
result[right].append(left)
else:
result[right] = [left]
部分執(zhí)行結(jié)果如下。
{'灃惠': [0], '校區(qū)': [0, 1, 3, 4], '圖書館': [0, 1], '地址': [0, 1], '閻良': [1, 3, 4], '咨詢電話': [2], '開放': [3, 4], '時(shí)間': [3, 4], '書庫(kù)': [4]}。其中,0,1,2,3……為文檔編號(hào)。例如,'閻良': [1, 3, 4]表示在第1、3、4個(gè)文檔中都含有“閻良”這個(gè)詞語(yǔ)。
對(duì)用戶輸入的問題進(jìn)行分詞,過濾停用詞,提取關(guān)鍵詞,并在倒排表中匹配到的所有問題ID,執(zhí)行程序如下。
User_Q="用戶問題"
clean_reviewyonghu=remove_punctuation(User_Q)
cut_reviewyonghu=[w for w in list(jieba.cut(clean_re-viewyonghu)) if w not in stopwords and len(w)>1]
Problem_Id=[]
for j in cut_reviewyonghu:
if j in result.keys():
Problem_Id.extend(result[j])
id=(list(set(Problem_Id)))
print(id)

表1 實(shí)驗(yàn)語(yǔ)料庫(kù)(部分)

表2 數(shù)據(jù)預(yù)處理結(jié)果(部分)
第一行表示載入用戶問題User_Q;第二到四行表示對(duì)User_Q進(jìn)行數(shù)據(jù)清洗,包括除標(biāo)點(diǎn)、分詞、去掉停用詞及單字詞等,形成cut_reviewyonghu集合;五到九行表示遍歷cut_reviewyonghu和倒排表result,匹配到所有問題ID。例如,當(dāng)用戶輸入即User_Q=“圖書丟啦怎么辦”時(shí),執(zhí)行程序,結(jié)果為[17,13,14,15],表示用戶的問題包含在第17、13、14、15文檔中。
定義函數(shù),對(duì)用戶所提問題分別與3.3節(jié)的執(zhí)行結(jié)果進(jìn)行相似度計(jì)算,并輸出相似度最高的兩個(gè)問題的答案,執(zhí)行程序如下。
def cosine_similarity(sentence1: str, sentence2: str)-> float:
seg1 = [word for word in jieba.cut(sentence1) if word not in stopwords]
seg2 = [word for word in jieba.cut(sentence2) if word not in stopwords]
word_list = list(set([word for word in seg1 + seg2]))
word_count_vec_1 = []
word_count_vec_2 = []
for word in word_list:
word_count_vec_1.append(seg1.count(word))
word_count_vec_2.append(seg2.count(word))
vec_1 = np.array(word_count_vec_1)
vec_2 = np.array(word_count_vec_2)
num = vec_1.dot(vec_2.T)
denom = np.linalg.norm(vec_1) * np.linalg.norm(vec_2)
cos = num / denom
sim = 0.5 + 0.5 * cos
return sim
str1=sentence
similarity={}
if len(id)==0:
print('數(shù)據(jù)庫(kù)里沒有該問題,請(qǐng)重新提問')
else:
for i in id:
str2 = file_txt.iloc[i]['問題']
sim1 = cosine_similarity(str1, str2)
print('用戶所提問題和問題{0}的相似度是{1}'.format(i, sim1))
similarity[i] = sim1
print(similarity)
word_list用于分詞后建立詞庫(kù),word_count_*統(tǒng)計(jì)在詞典里出現(xiàn)詞的次數(shù)。當(dāng)User_Q=“圖書丟啦怎么辦”時(shí),執(zhí)行結(jié)果如下。
用戶所提問題和問題17的相似度是0.644 337 567 297 406 4
用戶所提問題和問題13的相似度是0.704 124 145 231 931 5
用戶所提問題和問題14的相似度是0.704 124 145 231 931 5
用戶所提問題和問題15的相似度是0.704 124 145 231 931 5
經(jīng)過計(jì)算機(jī)的排序計(jì)算,輸出相似度較高的兩個(gè)問題的答案,形式如圖3所示。

圖3 實(shí)驗(yàn)結(jié)果
本文對(duì)基于倒排表的圖書館參考咨詢問答系統(tǒng)的現(xiàn)狀進(jìn)行了詳細(xì)分析,然后進(jìn)行了系統(tǒng)設(shè)計(jì)和詳細(xì)設(shè)計(jì),并以西安航空學(xué)院圖書館參考咨詢?yōu)槔瑢?shí)現(xiàn)了相關(guān)功能。本文所設(shè)計(jì)的問答系統(tǒng)能夠滿足圖書館參考咨詢的使用需求,語(yǔ)料庫(kù)的不斷更新與完善將是未來的研究重點(diǎn)。