問答系統搭建過程

2021-10-10 20:23:11 字數 1985 閱讀 4212

假設我們的庫裡面已有存在以下幾個《問題,答案》:

假設乙個使用者往系統中輸入了問題 「{}是做什麼的?」, 那這時候系統先去匹配最相近的「已經存在庫里的」問題。 那在這裡很顯然是 「{}是做什麼的」和「{}主要做什麼方面的業務?」是最相近的。 所以當我們定位到這個問題之後,直接返回它的答案 「他們主要做人工智慧方面的教育」就可以了。 所以這裡的核心問題可以歸結為計算兩個問句(query)之間的相似度。

dev-v2.0.json: 這個資料報含了問題和答案的pair, 但是以json格式存在,需要編寫parser來提取出裡面的問題和答案。

spell-errors.txt這個檔案主要用來編寫拼寫糾錯模組。 檔案中第一列為正確的單詞,之後列出來的單詞都是常見的錯誤寫法。 但這裡需要注意的一點是我們沒有給出他們之間的概率,也就是p(錯誤|正確),所以我們可以認為每一種型別的錯誤都是同等概率vocab.txt這裡列了幾萬個英文常見的單詞,可以用這個詞庫來驗證是否有些單詞被拼錯

testdata.txt這裡蒐集了一些測試資料,可以用來測試自己的spell corrector。這個檔案只是用來測試自己的程式。

把給定的文字資料讀入到qlistalist當中,這兩個分別是列表,其中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的第乙個...