赞
踩
目标:实现一个问答系统
功能:输入一个问题query,能够得到一个正确的/合适的答案
已有资源:问答对库,包含大量的问答对
实现思路:通过将query与问答对库中的问题进行比对,找到最相似的问题,将其对应的答案作为输入query的答案
涉及到的任务描述:
文本读取、文本预处理、文本表示、文本相似度匹配、倒排表、词义匹配、拼写纠错
项目实现需要的数据:
词向量表示数据glove.6B
一、数据预处理:
目标: 对于训练数据的预处理,包含读取文件和文本预处理
1.1 文本读取:
从文件中读取数据,此处需要读取的文件是【问答对库】,并分别把问题和答案放入两个list,且保证两个列表qliist、alist意义对应。
(考虑到后续在进行query和问答对库中的问题进行相似度匹配时只用到question,而没有用到answer,所以只需要对questions进行向量表示,不需要对answers做文本处理,所以此处将两者分开存储)
- """
- - 读取给定的语料库,并把问题列表和答案列表分别写入到 qlist, alist 里面。
- - 在此过程中,不用对字符换做任何的处理(这部分需要在 Part 2.3里处理)
- - qlist = ["问题1", “问题2”, “问题3” ....]
- - alist = ["答案1", "答案2", "答案3" ....]
- - 务必要让每一个问题和答案对应起来(下标位置一致)
- """
1.2 理解数据(可视化分析/统计信息)
对数据有一个直观的认识,- 在qlist中出现的总单词的个数;- 按照词频画一个histogram图
1.3 文本预处理
- """
- - 1. 停用词过滤 (去网上搜一下 "english stop words list",会出现很多包含停用词库的网页,或者直接使用NLTK自带的)
- - 2. 转换成lower_case: 这是一个基本的操作
- - 3. 去掉一些无用的符号: 比如连续的感叹号!!!, 或者一些奇怪的单词。
- - 4. 去掉出现频率很低的词:比如出现次数少于10,20.... (想一下如何选择阈值)
- - 5. 对于数字的处理: 分词完只有有些单词可能就是数字比如44,415,把所有这些数字都看成是一个单词,
- 这个新的单词我们可以定义为 "#number"
- - 6. lemmazation: 在这里不要使用stemming, 因为stemming的结果有可能不是valid word。
- """
-
- # 注意:以下步骤使用的顺序不同,会出现不同的文本处理结果
- # 1.处理标点符号:去除question中的标点符号
- input:qlist; output: new qlist
- # 2.停用词过滤:注意不同任务场景下的停用词包含的范围不同,如what,where,why等在问答场景下的角色是关键词
- input:qlist; output: new qlist
- # 3.数字替换称#number: 将question中的数字同意替换成#number
- input:qlist,replace = '#number'; output: new qlist
- # 4.统计词频,及创建词库(统计词频可用于下一步骤中的去除低频词汇)
- input:qlist,replace = '#number'; output: vocab_count, count(词及词频,基于qlist构建的词典的长度)
- # 5.去除低频词汇:通过设置频率阈值选择 ——>输出是
- input:qlist,vocab_count,threshold; output: new qlist
- 针对每个问题中的每个单词进行处理
二、文本表示
第一种:使用tf-idf vector
第二种:使用embedding技术,如word2vec, bert embedding
2.1 使用tf-idf表示向量
- """
- 把qlist中每一个问题的字符串转换成tf-idf向量,转换之后的结果存储在X矩阵中,
- 其形状是N*D,N是qlist中包含的question的个数, D是构建的vocabulary的大小
- 思路:使用TF-IDF的方法计算得到每个question的向量表示
- 实现:使用TF-IDF方法实现单词的向量表示
- 依据公式 TF-IDF = TF(词频) * IDF(逆文档频率)
- 对于qlist求tfidf向量表示
- ——>对每个question求tfidf向量表示(1*D)
- ——>对vocabulary中的每个词求tfidf向量表示
- ——>对每个词求tf,idf,最后得到其tfidf
- """
2.2 使用word2vec + average pooling表示向量
- """
- 目标:使用glove实现向量表示
- 思路:基于Glove向量获取句子向量,在获取到每个词的词向量后,即可得到一个句子的向量。通过“average pooling”实现句子的向量。
- (需要下载 https://nlp.stanford.edu/projects/glove/ (请下载``glove.6B.zip``&#x
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。