xml中文档(query)的结构:

<topic>
<number>CIRB010TopicZH006</number>
<title>科索沃難民潮</title>
<question>
查詢科索沃戰爭中的難民潮情況,以及國際間對其采取的援助。
</question>
<narrative>
相關文件內容包含科省難民湧入的地點、人數。受安置的狀況,難民潮引發的問題,参與救援之國家與國際組織,其援助策略與行動內容之報導。
</narrative>
<concepts>
科省、柯省、科索沃、柯索伏、難民、難民潮、難民營、援助、收容、救援、醫療、人道、避難、馬其頓、土耳其、外交部、國際、聯合國、紅十字會、阿爾巴尼亞裔難民。
</concepts>
</topic>

文档列表的样子(file-list)

CIRB010/cdn/loc/CDN_LOC_0001457
CIRB010/cdn/loc/CDN_LOC_0000294
CIRB010/cdn/loc/CDN_LOC_0000120
CIRB010/cdn/loc/CDN_LOC_0000661
CIRB010/cdn/loc/CDN_LOC_0001347
CIRB010/cdn/loc/CDN_LOC_0000439

词库的样子(vocab.all) 中文的话是单个字一行

utf8
Copper
version
EGCG
432Kbps
RESERVECHARDONNAY
TommyHolloway
platts
Celeron266MHz
VOLKSWAGEN
INDEX
SmarTone

倒排文档的表示(inverted-file)

词库中词的行号1  词库中词的行号2(-1表示单个词,仅仅考虑1)文档个数

文档在列表中的行数 词出现的次数

1 -1 2
33689 1
38365 1
2 -1 1
33256 1
2 12371 1
33256 1
3 -1 1
10849 2
3 6756 1

代码实现 仅仅是考虑单个的字

# -*- coding: utf-8 -*-
#!usr/bin/python import sys
import getopt
from xml.dom.minidom import parse
import xml.dom.minidom
import scipy.sparse as sp
from numpy import *
from math import log
from sklearn.preprocessing import normalize #deal with the argv
def main(argv):
ifFeedback=False
try:
opts,args=getopt.getopt(argv,'ri:o:m:d:',[])
except getopt.GetoptError:
# run input
print 'wrong input'
for opt,arg in opts:
if opt=='-r' and ifFeedback==False:
ifFeedback=True
elif opt=='-i':
queryFile=arg
elif opt=='-o':
rankedList=arg
elif opt=='-m':
modelDir=arg
elif opt=='-d':
NTCIRDir=arg
else:
pass
return ifFeedback,queryFile,rankedList,modelDir,NTCIRDir
#if __name__=='__main__' : #get the path in the arguments
ifFeedback,queryFile,rankedList,modelDir,NTCIRDir=main(sys.argv[1:])
#print ifFeedback,queryFile,rankedList,modelDir,NTCIRDir #get the file path in the model-dir
vocab=modelDir+'/vocab.all'
fileList=modelDir+'/file-list'
invList=modelDir+'/inverted-file' #read
pf=open(vocab,'r')
vocab=pf.read()
pf.close() pf=open(fileList,'r')
fileList=pf.read()
pf.close() pf=open(invList,'r')
invList=pf.read()
pf.close() #splitlines
vocab=vocab.splitlines();
fileList=fileList.splitlines()
invList=invList.splitlines() # vocab dict
vocabDict={}
k=0
while k <len(vocab):
vocabDict[vocab[k]]=k
k+=1 #get the TF and IDF matrix
#dimension:
#tfMatrix=sp.csr_matrix(len(fileList),len(vocab)) IDFVector=zeros(len(vocab))
totalDocs=len(fileList)
count=0
tempMatrix=zeros((len(fileList),len(vocab))) while count<len(invList):
postings=invList[count]
post=postings.split(' ')
k=1
#just deal with the single word
if(len(post)>2 and post[1]=='-1'):
IDFVector[int(post[0])]=int(post[2])
while k<=int(post[2]):
line=invList[count+k].split(' ')
tempMatrix[int(line[0])][int(post[0])]=int(line[1])
k+=1
count+=k tfMatrix=sp.csr_matrix(tempMatrix) #BM25
doclens=tfMatrix.sum(1)
avglen=doclens.mean()
k=7
b=0.7
#
tp1=tfMatrix*(k+1)
tp2=k*(1-b+b*doclens/avglen)
tfMatrix.data+=array(tp2[tfMatrix.tocoo().row]).reshape(len(tfMatrix.data))
tfMatrix.data=tp1.data/tfMatrix.data #calculate the idf
k=0
while k<len(vocab):
if IDFVector[k]!=0:
IDFVector[k]=log(float(totalDocs)/IDFVector[k])
k+=1
#tf-idf
tfMatrix.data*=IDFVector[tfMatrix.indices] #row normalization for tf-idf matrix
normalize(tfMatrix,norm='l2',axis=1,copy=False) #deal with the query
doc=xml.dom.minidom.parse(queryFile)
root=doc.documentElement
topics=root.getElementsByTagName('topic')
rankList=''
for topic in topics:
#query vector
qVector=zeros(len(vocab)) number=topic.getElementsByTagName('number')[0].childNodes[0].data
title=topic.getElementsByTagName('title')[0].childNodes[0].data question=topic.getElementsByTagName('question')[0].childNodes[0].data
narrative=topic.getElementsByTagName('narrative')[0].childNodes[0].data
concepts=topic.getElementsByTagName('concepts')[0].childNodes[0].data narrative+=question+concepts
for w in narrative:
if vocabDict.has_key(w.encode('utf8')):
qVector[vocabDict[w.encode('utf8')]]+=1
for w in title:
if vocabDict.has_key(w.encode('utf8')):
qVector[vocabDict[w.encode('utf8')]]+=1
#...normalization
normalize(qVector,norm='l2',axis=1,copy=False)
#similarity compute:
#a sparse matrix
sim=tfMatrix*(sp.csr_matrix(qVector).transpose()) sim=sim.toarray()
k=0
simCount=[]
while k<len(fileList):
tup=(sim[k],k)
simCount.append(tup)
k+=1 #sort
simCount.sort(reverse=True)
simCount=simCount[:100]
if ifFeedback:
topk=[]
for score,k in simCount[:20]:
topk.append(k)
d=tfMatrix[topk,:].sum(0)/20
qVector+=array(0.8*d).reshape(len(qVector))
#.....
normalize(qVector,norm='l2',axis=1,copy=False)
#similarity compute:
#a sparse matrix
sim=tfMatrix*(sp.csr_matrix(qVector).transpose()) sim=sim.toarray()
k=0
simCount=[]
while k<len(fileList):
tup=(sim[k],k)
simCount.append(tup)
k+=1 #sort
simCount.sort(reverse=True)
simCount=simCount[:100]
#..... num=number.split('ZH')
num=num[1]
for sim in simCount:
name=fileList[sim[1]]
name=name.split('/')
name=name[3].lower()
rank=num+' '+name
rankList+=rank+'\n' pf=open(rankedList,'w')
pf.write(rankList)

向量空间模型实现文档查询(Vector Space Model to realize document query)的更多相关文章

  1. 向量空间模型(Vector Space Model)的理解

    1. 问题描述 给你若干篇文档,找出这些文档中最相似的两篇文档? 相似性,可以用距离来衡量.而在数学上,可使用余弦来计算两个向量的距离. \[cos(\vec a, \vec b)=\frac {\v ...

  2. Solr相似度名词:VSM(Vector Space Model)向量空间模型

    最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查找相似度最高的.最优的结果.索性就直接跳到这个问题看,很多资料都提到了VSM(Vector Space Model)即向 ...

  3. 向量空间模型(Vector Space Model)

    搜索结果排序是搜索引擎最核心的构成部分,很大程度上决定了搜索引擎的质量好坏.虽然搜索引擎在实际结果排序时考虑了上百个相关因子,但最重要的因素还是用户查询与网页内容的相关性.(ps:百度最臭名朝著的“竞 ...

  4. ES搜索排序,文档相关度评分介绍——Vector Space Model

    Vector Space Model The vector space model provides a way of comparing a multiterm query against a do ...

  5. 转:Lucene之计算相似度模型VSM(Vector Space Model) : tf-idf与交叉熵关系,cos余弦相似度

    原文:http://blog.csdn.net/zhangbinfly/article/details/7734118 最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查 ...

  6. Elasticsearch增删改查 之 —— mget多文档查询

    之前说过了针对单一文档的增删改查,基本也算是达到了一个基本数据库的功能.本篇主要描述的是多文档的查询,通过这个查询语法,可以根据多个文档的查询条件,返回多个文档集合. 更多内容可以参考我整理的ELK文 ...

  7. ES 父子文档查询

    父子文档的特点 1. 父/子文档是完全独立的. 2. 父文档更新不会影响子文档. 3. 子文档更新不会影响父文档或者其它子文档. 父子文档的映射与索引 1. 父子关系 type 的建立必须在索引新建或 ...

  8. css盒子模型、文档流、相对与绝对定位、浮动与清除模型

    一.CSS中的盒子模型 标准模式和混杂模式(IE).在标准模式下浏览器按照规范呈现页面:在混杂模式下,页面以一种比较宽松的向后兼容的方式显示.混杂模式通常模拟老式浏览器的行为以防止老站点无法工作. h ...

  9. Elasticsearch文档查询

    简单数据集 到目前为止,已经了解了基本知识,现在我们尝试用更逼真的数据集,这儿已经准备好了一份虚构的JSON,关于客户银行账户信息的.每个文档的结构如下: { , , "firstname& ...

随机推荐

  1. 我的第一个ajax脚本

    代码如下 //创建XMLHttpRequest对象 var xmlHttp=null; function creatXMLHttp(){ try{ xmlHttp = new XMLHttpReque ...

  2. LeetCode(90) Subsets II

    题目 Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...

  3. 【Oracle】使用dblink+minus方式迁移数据

    一.需求说明 1.数据库a104的表syssde.a4_syssde_department中有1000条数据: 2.数据库a230的表syssde.a4_syssde_department中有800条 ...

  4. Linux下制作不用密码可立即登录的SSH用户

    一.客户端建立两把钥匙 (1)本例以客户端的monkey用户为例,首先切换到~/.ssh目录下,如果没有该目录的话,需要进行新建 cd ~ mkdir .ssh chmod 700 .ssh cd ~ ...

  5. appium之android_uiautomator定位进阶版

    前言 上一篇介绍uiautomator的定位方式都是类似这种'new UiSelector().xxx("xxx")',看起非常长,我也记不住,这很不python.于是本篇优化了定 ...

  6. 【JavaScript 13—应用总结】:锁屏遮罩

    导读:上次说了,当弹出登录框时,由于背景色和弹出框时一样的,这样子,其实比较难聚焦到底该操作哪一块.所以,如果,有了颜色的区分,那么通过屏幕遮罩的效果,就可以将我们希望要被处理的东西突出显示.也就达到 ...

  7. 刷题总结——赛车(bzoj3190)

    题目: 题目背景 JLOI2013 T1 题目描述 这里有一辆赛车比赛正在进行,赛场上一共有 N 辆车,分别称为 g1,g2,……,gn.赛道是一条无限长的直线.最初,gi 位于距离起跑线前进 ki  ...

  8. spring之Annotation

    spring除了提供了@Autowired,还提供了以下几类annotation. 1.@Component, @Repository, @Service, @Controller @Reposito ...

  9. Django REST

    一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度 ...

  10. [USACO08DEC]Trick or Treat on the Farm (拓扑排序,DP)

    题目描述 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐. ...