gensim提取一个句子的关键词_搭建一个QA系统(详细版)

53b4101bfe17dfb5542c9982d6144924.png

目标:实现一个问答系统

功能:输入一个问题query,能够得到一个正确的/合适的答案

已有资源:问答对库,包含大量的问答对

实现思路:通过将query与问答对库中的问题进行比对,找到最相似的问题,将其对应的答案作为输入query的答案

涉及到的任务描述

文本读取、文本预处理、文本表示、文本相似度匹配、倒排表、词义匹配、拼写纠错

项目实现需要的数据

词向量表示数据glove.6B

6bf0ef38b6fa8b30411e3b4c5e3e2622.png
QA的框架图

e79113a320af5ebc07e42911aeebfa93.png

一、数据预处理:

目标: 对于训练数据的预处理,包含读取文件和文本预处理

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值