这次的诈尸包括: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] 自动问答这一块还有些可以做的,比如语义,问句该怎样评价他的意图?答句,如何在获得答案关键词的条件下合理生成?这些在本次实验中没有深究,以后可以慢慢玩……
如果有错误欢迎指出……我也想成大佬啊……
[2] Goldberg, Y. (2015). A primer on neural network models for natural language processing. Computer Science.
[3]http://hfl.iflytek.com/chinese-rc/.