用户的输入的问题总是会有很多的"杂质",比如一些不必要的标点符号等等,会影响后面的处理,所以我们需要进行清洗得到干净的问题。例如:用户输入的问题“华为,是什么?”清洗后得到“华为是什么”
实体抽取采用jieba自定义词典再分词的方法。(1)对于建立的金融数据库,其关键实体一般为高管、企业、概念、行业,于是将前面得到的可导入的csv文件中的所有的高管、企业、概念、行业抽取出来,分别给予ne、ns、nc、ni词性,最后得到自定义词典mydict.txt,内容如下
余劲15ne周学军15ne艾华集团15ns亿帆医药15nsIPV6概念15nc前海概念15nc印刷包装15ni家电行业15ni...使用jieba.load_usrdict(mydict_txt)的方法将自定义词典导入jieba分词中(2)使用jieba分词工具的词性标注方法得到实体类型:实体字典和实体抽取后的问题若问题中有上面自定义词典中的实体,就会被词性标记为ne、ns、nc或ni,我们将该词性和对应的实体存入字典中,再将原先的问题中的抽出的关键实体用词性替换,得到抽取后的问题序列。下面举一个具体的例子。问题“华为是什么”会被jieba分词标注为[('华为','ns'),('是','v'),('什么','r')],进而我们得到字典{'ns',华为}和实体抽取后问题“nr是什么”
接下来需要将实体抽取后的问题映射到具体的问题模板(编号),我们采用分类的方法。(1)首先建立训练集,X_train是问题,y_train是对应的模板编号
'''问题模板编号-问题模板0:企业的介绍1:高管的介绍...'''X_train=["ne是什么","ne的介绍","ne的个人信息","ns是什么","ns怎么样"...]y_train=[1,1,1,0,0...](2)接下来对X_train中的每一个数据进行文本特征的提取,我们使用了sklearn中的tfidvectorizer文本特征处理器,举例:“ne是什么”通过文本特征提取会得到[0.707106780.70710678](3)将特征提取后的X_train,y_train输入分类器中进行训练得到问题-问题模板编号分类器,这里我们使用贝叶斯分类器来进行分类
前面我们得到了问题模板编号和实体类型:实体字典,下面就可以用它们来得到相应的查询语句cql。比如,前面我们得到了问题模板编号0和{'ns':华为字典},进而可以得到如下查询语句