假設我們的庫裡面已有存在以下幾個《問題,答案》:
假設乙個使用者往系統中輸入了問題 「{}是做什麼的?」, 那這時候系統先去匹配最相近的「已經存在庫里的」問題。 那在這裡很顯然是 「{}是做什麼的」和「{}主要做什麼方面的業務?」是最相近的。 所以當我們定位到這個問題之後,直接返回它的答案 「他們主要做人工智慧方面的教育」就可以了。 所以這裡的核心問題可以歸結為計算兩個問句(query)之間的相似度。
dev-v2.0.json
: 這個資料報含了問題和答案的pair, 但是以json格式存在,需要編寫parser來提取出裡面的問題和答案。
spell-errors.txt
這個檔案主要用來編寫拼寫糾錯模組。 檔案中第一列為正確的單詞,之後列出來的單詞都是常見的錯誤寫法。 但這裡需要注意的一點是我們沒有給出他們之間的概率,也就是p(錯誤|正確),所以我們可以認為每一種型別的錯誤都是同等概率
vocab.txt
這裡列了幾萬個英文常見的單詞,可以用這個詞庫來驗證是否有些單詞被拼錯
testdata.txt
這裡蒐集了一些測試資料,可以用來測試自己的spell corrector。這個檔案只是用來測試自己的程式。
把給定的文字資料讀入到qlist
和alist
當中,這兩個分別是列表,其中qlist
是問題的列表,alist
是對應的答案列表
import json
def read_corpus():
"""讀取給定的語料庫,並把問題列表和答案列表分別寫入到 qlist, alist 裡面。 在此過程中,不用對字元換做任何的處理(這部分需要在 part 2.3裡處理)
qlist = ["問題1", 「問題2」, 「問題3」 ....]
alist = ["答案1", "答案2", "答案3" ....]
務必要讓每乙個問題和答案對應起來(下標位置一致)
"""qlist =
alist =
datas = json.load(open('train-v2.0.json'))['data']
for data in datas:
paragraphs = data['paragraphs']
for paragraph in paragraphs:
qas = paragraph['qas']
for qa in qas:
question = qa['question']
answers = qa['answers']
assert len(qlist) == len(alist) # 確保長度一樣
return qlist, alist
對資料的理解是任何ai工作的第一步, 需要對資料有個比較直觀的認識。在這裡,簡單地統計一下:
import matplotlib.pyplot as plt
q,a = read_corpus()
# todo: 統計一下在qlist中總共出現了多少個單詞? 總共出現了多少個不同的單詞(unique word)?
# 這裡需要做簡單的分詞,對於英文我們根據空格來分詞即可,其他過濾暫不考慮(只需分詞)
word =
for s in q:
s = s[:-1]
for w in s:
word_dict = {}
for w in word:
if w not in word_dict:
word_dict[w] = 0
else:
word_dict[w] += 1
word_total = len(word_dict)
plt.hist(word)
plt.show()
print (word_total)
此部分需要做文字方面的處理。 以下是可以用到的一些方法: 問答系統調研
大型qa系統大多數是基於web資訊檢索的,各級nlp技術比如句法分析,ner,ir ie等都會涉及。還有一種是基於knowledge base的,將自然問句形式化成query,到知識庫裡檢索答案。如果想自己做乙個簡單系統的話可以先選擇乙個特定領域比如醫療qa,到網上抓取資料,用語義網rdf owl構...
PyAiml問答系統構建
pyaiml問答系統在使用過程中有一下問題 1.匹配的時候 只能代表乙個字元以及乙個字元以上,而不能代表空值,導致需要多些很多規則。x 哪 x 哪 2.匹配的時候,遇見同義詞只能新增規則,不能用類似正規表示式 這種方式解決,導致也需要寫很多模板。x 那 x 那 3.不能新增排除專案,只能通過aiml...
問答系統筆記1
1.聊天資料中詞語在不同位置的概率分布具有非常明顯的長尾特性。詞語概率分布上的模式會優先被decoder的語言模型學到,並在生成過程中嚴重抑制query和response之間詞語關聯模式的作用,即便有了query的語義向量作為條件,decoder仍然會挑選概率最大的 我 作為response的第乙個...