搜索引擎的一个实验

这次的诈尸包括:1.词向量,2.文档相似度,3.简易关键词检索,4.极其简易问答系统。本来基于一个搜索引擎课程的实验报告,但总觉得一个报告写不完,不刺激。整个实验环境在python3.5下

1. 词向量:

词向量用来表示可以简单点,一个词可以只有这个词本身,也可以包括一些其他属性,如词性,句法结构信息,语义结构信息,命名实体……具体什么意思,哈工大LTP的页面里有比较详细的信息……[1] 如果暴力一点,有一个谷歌爸爸的word2vec的东西,是一个浅层网络的计算,这个可以将词表示成一系列数,数的个数还能变,这个叫embeding size,这个值根据以前的经验一般可以取50到小量的几百维[2]。怎么get词向量?有一个叫做gensim的工具包,里面有word2vec的封装,可以一用。这个工具只需要pip install genism就可以了,numpy 环境是需要加mlk的那种,的否则报错

from gensim.models import word2vec
sentence=word2vec.Text8Corpus('list.txt')
# model = Word2Vec(sentences, size=100(词向量维度), window=5(最大距离), min_count=5(最小词数量,低于这个值就被除去))
model=word2vec.Word2Vec(sentence,size=100,min_count=1)
model.save('test') # 最好先存一个,方便未来取出来
model=word2vec.Word2Vec.load('test') # 把模型取出来
print(model.wv['单身']) # 确定每一个字的向量

词向量结果

2. 文档相似度:

Emmmm……感觉没什么可以说的,就是把文章用词来表示出来,再用余弦计算,比如这样:

文档向量编辑

做下其他变形还能做出其他改法,比如除一个文章总词数,设定低词频的过滤,找近义词。 同时,对于什么样的文档称为相近?可以设置参数,比如余弦值到达0.8可能是相似的,也有可能0.5就相似了,而且这种东西并没有什么标准答案啊,两篇文档是否相似完全凭个人感受,又不是文档分类问题一定有标准的类别……顺便在python里计算这种东西最好用一个叫做numpy的工具包,速度比自己写for循环快100倍。

def CountCos(A,B,minsim,maxsim):
    '''
    :param A:文档A生成的向量列表 
    :param B: 文档B生成的向量列表
    :param minsim: 最小相似度
    :param maxsim: 最大相似度
    :return: 1:这两篇文档相似度大于最大值
              2:这两篇文档相似度仅大于最小值
              0:这两篇文档不相似
    '''
    import numpy as np
    import datetime
    t1=datetime.datetime.now()
    A=np.array(A)
    B=np.array(B)
    Lx = np.sqrt(A.dot(A))
    Ly = np.sqrt(B.dot(B))
    cos = A.dot(B) / (Lx * Ly)
    t2=datetime.datetime.now()
    # 关于时间的仅仅是统计一个时间
    with open('time.txt','a',encoding='utf-8') as fin:
        fin.write(str((t2-t1).microseconds)+'\n')
    # print(cos)
    if cos>maxsim:
        return 1
    elif cos>minsim:
        return 2
    else:return 0

3. 简易的基于关键词检索:

之前的操作都是一个文档对应一堆词,而检索则需要一个词对应一堆文档,反了。具体做法是一个文档分词,词频统计出来会有一堆词,建立关于这些词的词典,如果文档里有这个词,就将文档放入这个词的值里,就像这样:

建立索引

对于查询词只有单个,直接返回就好了,如果有多个,就取交集,交的越多越在前面。如果做优化的话就查询词进行扩充,如近义词之类的,扩充完了在去找相近度最高的文档

查询结果

4. 极其简单的自动问答:

这个自动问答的目的是询问一个人名或地名或机构名,然后就能正确回答,真的只是一个非常非常简陋的东西。为什么只选择这3个值?很简单,语料问题。这3个值是能够用命名实体的方法识别出来的,并不需要做额外的人工标注(本身也不想做人工标注……)。如果想针对这种非结构信息做更复杂的对话系统,个人观点是应当先建立规则,针对制定的规则进行信息抽取,根据抽取结果建立实体与实体之间的关系模式,一般是三元组,如<实体,关系名,实体>。能给多少文档打上这样的关系标签,最后的问答系统应该也能得到更好的效果。

其实也想过能不能用机器阅读理解的方法来解决,但是查了下这个领域的数据缺少,而且语料信息和这里所需要的抽取结果不太相匹配,做出来的效果可能不太理想,现在这个新闻的语料也是哈工大给的。[3] 自动问答这一块还有些可以做的,比如语义,问句该怎样评价他的意图?答句,如何在获得答案关键词的条件下合理生成?这些在本次实验中没有深究,以后可以慢慢玩……

简易问答的结果

如果有错误欢迎指出……我也想成大佬啊……

[1] http://www.ltp-cloud.com/

[2] Goldberg, Y. (2015). A primer on neural network models for natural language processing. Computer Science.

[3]http://hfl.iflytek.com/chinese-rc/.

转载于:https://my.oschina.net/DDigimon/blog/1571553

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值