百度 AnyQ 配置說明

FAQ

所謂FAQ(Frequently Asked Questions)問答娄帖,指的是通過構(gòu)建一個數(shù)量巨大的問題答案庫來作為語料庫桑驱,當輸入一個問題時鳖粟,通過計算該問題與語料庫中的所有問題的語義相似度缕贡,給出語義最相似的問題所對應(yīng)的答案曙强。兩個問題語義相似度的計算方法,有:余弦相似度涎拉、Jaccard相似度瑞侮、BM25相似度等。

Indexing

在AnyQ系統(tǒng)中鼓拧,索引(Indexing)模塊的作用是根據(jù)所給定的問題答案數(shù)據(jù)集半火,通過將其轉(zhuǎn)換為語義索引庫,從而提供檢索(Retrieval)季俩、匹配(Matching)模塊進行語義相似度計算钮糖,匹配出與所提問題最相似的答案。

添加語義索引

語義索引庫構(gòu)建 AnyQ/build/example/conf/

  1. 將灌庫文件faq_file(utf8編碼)轉(zhuǎn)換成Json格式酌住,在最初的AnyQ系統(tǒng)中店归,所提供的問題答案數(shù)據(jù)集位于 AnyQ/build/solr_script/sample_doc阎抒。
{"question": "XXX", "answer": "XXX", "id": XXX}
cp -rp ../tool/solr ./solr_script
mkdir -p faq
python solr_script/make_json.py solr_script/sample_docs faq/schema_format faq/faq_json
  1. 對Json文本添加索引id:
awk -F "\t" '{print ++ind"\t"$0}' faq/faq_json > faq/faq_json.index
  1. 在anyq詞典配置dict.conf增加語義表示模型的插件:
dict_config{
    name: "fluid_simnet"
    type: "PaddleSimAdapter"
    path: "./simnet"
}
  1. 在analysis.conf中增加query語義表示的插件:
analysis_method {
    name: "method_simnet_emb"
    type: "AnalysisSimNetEmb"
    using_dict_name: "fluid_simnet"
    dim: 128
    query_feed_name: "left" 
    cand_feed_name: "right" 
    embedding_fetch_name: "tanh.tmp"
}
  1. 生成語義索引庫:
./annoy_index_build_tool example/conf/ example/conf/analysis.conf faq/faq_json.index 128 10 semantic.annoy 1>std 2>err

語義索引庫使用 AnyQ/build/example/conf/

  1. 把帶索引id的faq庫文件和語義索引庫放到anyq配置目錄下
cp faq/faq_json.index semantic.annoy example/conf
  1. 在dict.conf中配置faq庫文件的讀取
dict_config {
    name: "annoy_knowledge_dict"
    type: "String2RetrievalItemAdapter"
    path: "./faq_json.index"
}
  1. 在retrieval.conf中配置語義檢索插件
retrieval_plugin {
    name : "semantic_recall"
    type : "SemanticRetrievalPlugin"
    vector_size : 128
    search_k : 10000 
    index_path : "./example/conf/semantic.annoy"
    using_dict_name: "annoy_knowledge_dict"
    num_result : 10
}

Analysis

問題分析模塊(Analysis)是整個系統(tǒng)中對輸入問題進行解析的第一個模塊。該模塊所完成的主要功能有:

  1. 對句子進行分詞娱节;
  2. 對分詞后的每個單詞進行詞性標注(POS)挠蛉;
  3. 將每個單詞進行詞向量表示祭示;
  4. 命名實體識別(NER)肄满。參考文章

但是,在最初的AnyQ系統(tǒng)中质涛,其僅實現(xiàn)了句子分詞及詞向量表示功能稠歉,并提供了相應(yīng)功能插件的配置。其他汇陆,例如POS和NER的功能需要用戶自行實現(xiàn)并添加怒炸。

添加分詞

用戶詞典

在策略插件中使用的詞典,需在 AnyQ/build/example/dict.conf 中配置毡代。當前系統(tǒng)的詞典插件主要包括以下幾種:

  • 哈希詞典:HashAdapter<TYPE1, TYPE2>
  • 干預(yù)詞典:String2RetrievalItemAdapter
  • 切詞詞典: WordsegAdapter
  • Paddle SimNet匹配模型詞典: PaddleSimAdapter
  • Tensorflow模型詞典: TFModelAdapter

配置方式如下所示:

# 干預(yù)詞典
dict_config {
    name: "rank_weights"
    type: "String2FloatAdapter"
    path: "./rank_weights"
}

# 切詞詞典
dict_config {
    name: "lac"
    type: "WordsegAdapter"
    path: "./wordseg_utf8"
}

# paddle SimNet匹配模型詞典
dict_config{
    name: "fluid_simnet"
    type: "PaddleSimAdapter"
    path: "./simnet"
}

分詞

AnyQ/build/example/analysis.conf 中可以增添query分析策略插件阅羹。當前系統(tǒng)的analysis插件主要包括以下幾種:

  • 切詞:AnalysisWordseg
  • query語義向量表示:AnalysisSimNetEmb
  • query替換: AnalysisQueryIntervene

配置方式如下所示:

# 切詞
analysis_method {
    name: "method_wordseg"
    type: "AnalysisWordseg"
    using_dict_name: "lac"
}

添加詞向量表示

句子分詞功能添加完畢后,要實現(xiàn)分好詞的每個單詞進行詞向量的表示教寂,需要在解析模塊的配置文件中(AnyQ/build/example/analysis.conf)添加相應(yīng)功能插件捏鱼,其格式如下:

# 語義向量
analysis_method {
    name: "method_simnet_emb"
    type: "AnalysisSimNetEmb"
    using_dict_name: "fluid_simnet"
    dim: 128
    query_feed_name: "left"
    cand_feed_name: "right"
    embedding_fetch_name: "tanh.tmp"
}

Retrieval

輸入的問題通過分析模塊(Analysis)對問題進行分詞,詞向量表示等操作后酪耕,再輸入到問題檢索模塊(Retrieval)导梆,由該模塊將問題帶入到FAQ數(shù)據(jù)集中進行檢索,得到前N個候選問題迂烁。

該模塊目前所提供的問題檢索功能有:

  1. 基于關(guān)鍵詞的檢索(Term檢索看尼,TermRetrievalPlugin)
  2. 基于語義的檢索(SemanticRetrievalPlugin)
  3. 人工干預(yù)檢索(ManualRetrievalPlugin)

基于關(guān)鍵詞

基于關(guān)鍵詞的檢索,即根據(jù)已添加的數(shù)據(jù)集盟步,通過TF-IDF藏斩,為該數(shù)據(jù)集構(gòu)建倒排索引,當一個已經(jīng)分詞的問題輸入后却盘,匹配前N個候選問題狰域。

檢索模塊的配置路徑為 AnyQ/build/example/retrieval.conf ,通過在該文件中添加關(guān)鍵詞索引插件:

retrieval_plugin {
    name : "term_recall_1"
    type : "TermRetrievalPlugin"
    search_host : "127.0.0.1"
    search_port : 8900
    engine_name : "collection1"
    solr_result_fl : "id,question,answer"
    solr_q : {
        type : "EqualSolrQBuilder"
        name : "equal_solr_q_1"
        solr_field : "question"
        source_name : "question"
    }
    num_result : 15
}

其中谷炸,solr_q是solr搜索服務(wù)器查詢的插件北专,該插件所提供的搜索類型(type)有:

  • EqualSolrQBuilder:字段等于
  • BoostSolrQBuilder:字段term加權(quán)
  • ContainSolrQBuilder:字段包含關(guān)鍵詞
  • SynonymSolrQBuilder:字段term同義詞
  • DateCompareSolrQBuilder:日期字段比較

基于語義

基于語義的檢索,是由AnyQ中的SimNet模塊根據(jù)所提供數(shù)據(jù)集訓(xùn)練好后的模型旬陡,來對輸入問題(詞向量表示)與候選問題進行計算檢索拓颓。檢索模塊的配置路徑為 AnyQ/build/example/retrieval.conf ,通過在該文件中添加語義索引插件:

retrieval_plugin {
    name : "semantic_recall"
    type : "SemanticRetrievalPlugin"
    vector_size : 128
    search_k : 10000
    index_path : "./example/conf/semantic.annoy"
    using_dict_name: "annoy_knowledge_dict"
    num_result : 10
}

Matching

通過檢索模塊(Retrieval)從索引庫中得到N個候選問題以后描孟,需要帶入到問題匹配模塊(Matching)驶睦,依次對每個候選問題與輸入問題計算其相似度砰左。對于同一個候選問題-輸入問題對來說,可以同時計算多種類型的相似度.

該模塊目前所提供的相似度計算功能有:

  1. 編輯距離相似度:EditDistanceSimilarity;
  2. Cosine相似度:CosineSimilarity
  3. Jaccard相似度: JaccardSimilarity
  4. BM25相似度: BM25Similarity
  5. Paddle SimNet匹配模型相似度: PaddleSimilarity
  6. Tensorflow匹配模型相似度: TFSimilarity

分詞

將候選問題與輸入問題帶入到問題匹配模塊(Matching)以后场航,為了能夠與輸入問題進行相似度計算缠导,首先需要對候選問題進行分詞,其配置路徑為: AnyQ/build/example/rank.conf 溉痢。

配置插件為:

# 對候選切詞
matching_config {
    name : "wordseg_process"
    type : "WordsegProcessor"
    using_dict_name: "lac"
    output_num : 0
    rough : false
}

相似度計算

在該模塊中僻造,對候選問題與輸入問題進行相似度計算主要分為兩種:傳統(tǒng)的距離度量學(xué)習的方法(Cosine相似度、Jaccard相似度等)和深度學(xué)習的方法(語義相似度計算)孩饼。其配置路徑為: AnyQ/build/example/rank.conf 髓削。

配置插件為:

# Jaccard相似度
matching_config {
    name : "jaccard_sim"
    type : "JaccardSimilarity"
    output_num : 1
    rough : false
}

# Paddle SimNet匹配模型相似度
matching_config {
    name: "fluid_simnet_feature"
    type: "PaddleSimilarity"
    using_dict_name: "fluid_simnet"
    output_num : 1
    rough : false
    query_feed_name: "left"
    cand_feed_name: "right"
    score_fetch_name: "cos_sim_0.tmp"
}

# Tensorflow匹配模型相似度
matching_config {
    name : "tf_qq_match"
    type : "TFSimilarity"
    using_dict_name: "tf_qq_match"
    output_num : 1
    rough : false
    tfconf : {
        pad_id : 0
        sen_len: 32
        left_input_name: "left"
        right_input_name: "right"
        output_name: "output_prob"
    }
}

其中output_num表示該插件輸出的相似度值個數(shù),對于不輸出相似度的插件(如WordsegProcessor)镀娶,output_num應(yīng)配置為0; rough配置為true表示該相似度用于粗排立膛,反之則用于精排。
計算相似度需要先對候選切詞梯码,因此WordsegProcessor插件應(yīng)該配置在其他matching_config之前宝泵。
需要注意的是,在該模塊配置文件中轩娶,如果配置了多種相似度計算插件儿奶,則對于一個問題對來說,將對其分別計算相應(yīng)插件的相似度罢坝,最終得到多個相似度廓握,每一個相似度可看作該問題對的一個特征,這多個特征最終需要帶入到問題打分模塊(rank)來對該問題對進行綜合的打分嘁酿。

Ranking

AnyQ/build/example/rank.conf 中配置predictorc插件隙券,用于根據(jù)多個相似度對候選計算得分。當前系統(tǒng)的rank插件主要包括以下幾種:

  • 線性預(yù)測模型: PredictLinearModel
  • XGBoost預(yù)測模型: PredictXGBoostModel
  • 特征選擇預(yù)測模型:PredictSelectModel

配置格式如下:

rank_predictor {
    type: "PredictLinearModel"
    using_dict_name: "rank_weights"
}

SimNet

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闹司,一起剝皮案震驚了整個濱河市娱仔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌游桩,老刑警劉巖牲迫,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異借卧,居然都是意外死亡盹憎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門铐刘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陪每,“玉大人,你說我怎么就攤上這事¢莺蹋” “怎么了挂签?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盼产。 經(jīng)常有香客問我饵婆,道長,這世上最難降的妖魔是什么戏售? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任侨核,我火速辦了婚禮,結(jié)果婚禮上蜈项,老公的妹妹穿的比我還像新娘芹关。我一直安慰自己续挟,他們只是感情好紧卒,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诗祸,像睡著了一般跑芳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上直颅,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天博个,我揣著相機與錄音,去河邊找鬼功偿。 笑死盆佣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的械荷。 我是一名探鬼主播共耍,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吨瞎!你這毒婦竟也來了痹兜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤颤诀,失蹤者是張志新(化名)和其女友劉穎字旭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崖叫,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡遗淳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了心傀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈暗。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恐锦,到底是詐尸還是另有隱情往果,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布一铅,位于F島的核電站陕贮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏潘飘。R本人自食惡果不足惜肮之,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卜录。 院中可真熱鬧戈擒,春花似錦、人聲如沸艰毒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丑瞧。三九已至柑土,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绊汹,已是汗流浹背稽屏。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留西乖,地道東北人狐榔。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像获雕,于是被迫代替她去往敵國和親薄腻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容