当前位置:   article > 正文

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

gensim提取关键词

53b4101bfe17dfb5542c9982d6144924.png

目标:实现一个问答系统

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

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

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

涉及到的任务描述

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

项目实现需要的数据

词向量表示数据glove.6B

6bf0ef38b6fa8b30411e3b4c5e3e2622.png
QA的框架图

e79113a320af5ebc07e42911aeebfa93.png

一、数据预处理:

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

1.1 文本读取:

从文件中读取数据,此处需要读取的文件是【问答对库】,并分别把问题和答案放入两个list,且保证两个列表qliist、alist意义对应。

(考虑到后续在进行query和问答对库中的问题进行相似度匹配时只用到question,而没有用到answer,所以只需要对questions进行向量表示,不需要对answers做文本处理,所以此处将两者分开存储)

  1. """
  2. - 读取给定的语料库,并把问题列表和答案列表分别写入到 qlist, alist 里面。
  3. - 在此过程中,不用对字符换做任何的处理(这部分需要在 Part 2.3里处理)
  4. - qlist = ["问题1", “问题2”, “问题3” ....]
  5. - alist = ["答案1", "答案2", "答案3" ....]
  6. - 务必要让每一个问题和答案对应起来(下标位置一致)
  7. """

1.2 理解数据(可视化分析/统计信息)

对数据有一个直观的认识,- 在qlist中出现的总单词的个数;- 按照词频画一个histogram图

1.3 文本预处理

  1. """
  2. - 1. 停用词过滤 (去网上搜一下 "english stop words list",会出现很多包含停用词库的网页,或者直接使用NLTK自带的)
  3. - 2. 转换成lower_case: 这是一个基本的操作
  4. - 3. 去掉一些无用的符号: 比如连续的感叹号!!!, 或者一些奇怪的单词。
  5. - 4. 去掉出现频率很低的词:比如出现次数少于10,20.... (想一下如何选择阈值)
  6. - 5. 对于数字的处理: 分词完只有有些单词可能就是数字比如44,415,把所有这些数字都看成是一个单词,
  7. 这个新的单词我们可以定义为 "#number"
  8. - 6. lemmazation: 在这里不要使用stemming, 因为stemming的结果有可能不是valid word。
  9. """
  10. # 注意:以下步骤使用的顺序不同,会出现不同的文本处理结果
  11. # 1.处理标点符号:去除question中的标点符号
  12. input:qlist; output: new qlist
  13. # 2.停用词过滤:注意不同任务场景下的停用词包含的范围不同,如what,where,why等在问答场景下的角色是关键词
  14. input:qlist; output: new qlist
  15. # 3.数字替换称#number: 将question中的数字同意替换成#number
  16. input:qlist,replace = '#number'; output: new qlist
  17. # 4.统计词频,及创建词库(统计词频可用于下一步骤中的去除低频词汇)
  18. input:qlist,replace = '#number'; output: vocab_count, count(词及词频,基于qlist构建的词典的长度)
  19. # 5.去除低频词汇:通过设置频率阈值选择 ——>输出是
  20. input:qlist,vocab_count,threshold; output: new qlist
  21. 针对每个问题中的每个单词进行处理

二、文本表示

第一种:使用tf-idf vector

第二种:使用embedding技术,如word2vec, bert embedding

2.1 使用tf-idf表示向量

  1. """
  2. 把qlist中每一个问题的字符串转换成tf-idf向量,转换之后的结果存储在X矩阵中,
  3. 其形状是N*D,N是qlist中包含的question的个数, D是构建的vocabulary的大小
  4. 思路:使用TF-IDF的方法计算得到每个question的向量表示
  5. 实现:使用TF-IDF方法实现单词的向量表示
  6. 依据公式 TF-IDF = TF(词频) * IDF(逆文档频率)
  7. 对于qlist求tfidf向量表示
  8. ——>对每个question求tfidf向量表示(1*D)
  9. ——>对vocabulary中的每个词求tfidf向量表示
  10. ——>对每个词求tf,idf,最后得到其tfidf
  11. """

2.2 使用word2vec + average pooling表示向量

  1. """
  2. 目标:使用glove实现向量表示
  3. 思路:基于Glove向量获取句子向量,在获取到每个词的词向量后,即可得到一个句子的向量。通过“average pooling”实现句子的向量。
  4. (需要下载 https://nlp.stanford.edu/projects/glove/ (请下载``glove.6B.zip``&#x
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/350751
推荐阅读
  

闽ICP备14008679号