百度 AnyQ 配置说明

FAQ

所谓FAQ(Frequently Asked Questions)问答,指的是通过构建一个数量巨大的问题答案库来作为语料库,当输入一个问题时,通过计算该问题与语料库中的所有问题的语义相似度,给出语义最相似的问题所对应的答案。两个问题语义相似度的计算方法,有:余弦相似度、Jaccard相似度、BM25相似度等。

Indexing

在AnyQ系统中,索引(Indexing)模块的作用是根据所给定的问题答案数据集,通过将其转换为语义索引库,从而提供检索(Retrieval)、匹配(Matching)模块进行语义相似度计算,匹配出与所提问题最相似的答案。

添加语义索引

语义索引库构建 AnyQ/build/example/conf/

  1. 将灌库文件faq_file(utf8编码)转换成Json格式,在最初的AnyQ系统中,所提供的问题答案数据集位于 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)是整个系统中对输入问题进行解析的第一个模块。该模块所完成的主要功能有:

  1. 对句子进行分词;
  2. 对分词后的每个单词进行词性标注(POS);
  3. 将每个单词进行词向量表示;
  4. 命名实体识别(NER)。参考文章

但是,在最初的AnyQ系统中,其仅实现了句子分词及词向量表示功能,并提供了相应功能插件的配置。其他,例如POS和NER的功能需要用户自行实现并添加。

添加分词

用户词典

在策略插件中使用的词典,需在 AnyQ/build/example/dict.conf 中配置。当前系统的词典插件主要包括以下几种:

  • 哈希词典:HashAdapter<TYPE1, TYPE2>
  • 干预词典:String2RetrievalItemAdapter
  • 切词词典: WordsegAdapter
  • Paddle SimNet匹配模型词典: PaddleSimAdapter
  • Tensorflow模型词典: TFModelAdapter

配置方式如下所示:

# 干预词典
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分析策略插件。当前系统的analysis插件主要包括以下几种:

  • 切词:AnalysisWordseg
  • query语义向量表示:AnalysisSimNetEmb
  • query替换: AnalysisQueryIntervene

配置方式如下所示:

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

添加词向量表示

句子分词功能添加完毕后,要实现分好词的每个单词进行词向量的表示,需要在解析模块的配置文件中(AnyQ/build/example/analysis.conf)添加相应功能插件,其格式如下:

# 语义向量
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数据集中进行检索,得到前N个候选问题。

该模块目前所提供的问题检索功能有:

  1. 基于关键词的检索(Term检索,TermRetrievalPlugin)
  2. 基于语义的检索(SemanticRetrievalPlugin)
  3. 人工干预检索(ManualRetrievalPlugin)

基于关键词

基于关键词的检索,即根据已添加的数据集,通过TF-IDF,为该数据集构建倒排索引,当一个已经分词的问题输入后,匹配前N个候选问题。

检索模块的配置路径为 AnyQ/build/example/retrieval.conf ,通过在该文件中添加关键词索引插件:

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搜索服务器查询的插件,该插件所提供的搜索类型(type)有:

  • EqualSolrQBuilder:字段等于
  • BoostSolrQBuilder:字段term加权
  • ContainSolrQBuilder:字段包含关键词
  • SynonymSolrQBuilder:字段term同义词
  • DateCompareSolrQBuilder:日期字段比较

基于语义

基于语义的检索,是由AnyQ中的SimNet模块根据所提供数据集训练好后的模型,来对输入问题(词向量表示)与候选问题进行计算检索。检索模块的配置路径为 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
}

相似度计算

在该模块中,对候选问题与输入问题进行相似度计算主要分为两种:传统的距离度量学习的方法(Cosine相似度、Jaccard相似度等)和深度学习的方法(语义相似度计算)。其配置路径为: 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表示该插件输出的相似度值个数,对于不输出相似度的插件(如WordsegProcessor),output_num应配置为0; rough配置为true表示该相似度用于粗排,反之则用于精排。
计算相似度需要先对候选切词,因此WordsegProcessor插件应该配置在其他matching_config之前。
需要注意的是,在该模块配置文件中,如果配置了多种相似度计算插件,则对于一个问题对来说,将对其分别计算相应插件的相似度,最终得到多个相似度,每一个相似度可看作该问题对的一个特征,这多个特征最终需要带入到问题打分模块(rank)来对该问题对进行综合的打分。

Ranking

AnyQ/build/example/rank.conf 中配置predictorc插件,用于根据多个相似度对候选计算得分。当前系统的rank插件主要包括以下几种:

  • 线性预测模型: PredictLinearModel
  • XGBoost预测模型: PredictXGBoostModel
  • 特征选择预测模型:PredictSelectModel

配置格式如下:

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

SimNet

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容