一.問答系統
-
問答系統從知識領域划分:
- 封閉領域:封閉領域系統專注於回答特定領域的問題,由於問題領域受限,系統有比較大的發揮空間,可以導入領域知識或將答案來源全部轉換成結構性資料來有效提升系統的表現;
- 開放領域:開放領域系統則希望不設限問題的內容范圍,因此其難度也相對較大。
-
問答系統從實現方式划分:
- 基於流水線(pipeline)實現:如下圖 1 所示,基於流水線實現的問答系統有四大核心模塊,分別由自然語言理解(NLU)、對話狀態跟蹤器(DST)、對話策略(DPL)和自然語言生成(NLG)依次串聯構成的一條流水線,各模塊可獨立設計,模塊間協作完成任務。基於端到端(end-to-end)實現:
- 基於端到端實現的問答系統,主要是結合深度學習技術,通過海量數據訓練,挖掘出從用戶自然語言輸入到系統自然語言輸出的整體映射關系,而忽略中間過程的一種方法。但就目前工業界整體應用而言,工業界的問答系統目前大多采用的還是基於流水線實現的方式。
二.基於知識圖譜的問答系統框架
#!/usr/bin/env python3 # coding: utf-8 import os import ahocorasick from sklearn.externals import joblib import jieba import numpy as np class EntityExtractor: def __init__(self): pass # 構造actree,加速過濾 def build_actree(self, wordlist): """ 構造actree,加速過濾 :param wordlist: :return: """ pass # 模式匹配, 得到匹配的詞和類型。如疾病,疾病別名,並發症,症狀 def entity_reg(self, question): """ 模式匹配, 得到匹配的詞和類型。如疾病,疾病別名,並發症,症狀 :param question:str :return: """ pass # 當全匹配失敗時,就采用相似度計算來找相似的詞 def find_sim_words(self, question): """ 當全匹配失敗時,就采用相似度計算來找相似的詞 :param question: :return: """ pass # 采用DP方法計算編輯距離 def editDistanceDP(self, s1, s2): """ 采用DP方法計算編輯距離 :param s1: :param s2: :return: """ pass # 計算詞語和字典中的詞的相似度 def simCal(self, word, entities, flag): """ 計算詞語和字典中的詞的相似度 相同字符的個數/min(|A|,|B|) + 余弦相似度 :param word: str :param entities:List :return: """ pass # 基於特征詞分類 def check_words(self, wds, sent): """ 基於特征詞分類 :param wds: :param sent: :return: """ pass # 提取問題的TF-IDF特征 def tfidf_features(self, text, vectorizer): """ 提取問題的TF-IDF特征 :param text: :param vectorizer: :return: """ pass # 提取問題的關鍵詞特征 def other_features(self, text): """ 提取問題的關鍵詞特征 :param text: :return: """ pass # 預測意圖 def model_predict(self, x, model): """ 預測意圖 :param x: :param model: :return: """ pass # 實體抽取主函數 def extractor(self, question): pass