余弦相似度算法python_Python简单实现基于VSM的余弦相似度计算

计算“百度百科-故宫”和“互动百科-故宫”的消息盒相似度代码如下。基本步骤:

1.分别统计两个文档的关键词,读取txt文件,CountKey()函数统计

2.两篇文章的关键词合并成一个集合MergeKey()函数,相同的合并,不同的添加

3.计算每篇文章对于这个集合的词的词频 TF-IDF算法计算权重,此处仅词频

4.生成两篇文章各自的词频向量

5.计算两个向量的余弦相似度,值越大表示越相似

# -*- coding: utf-8 -*-

import time

import re

import os

import string

import sys

import math

''' ------------------------------------------------------- '''

#统计关键词及个数

def CountKey(fileName, resultName):

try:

#计算文件行数

lineNums = len(open(fileName,'rU').readlines())

print u'文件行数: ' + str(lineNums)

#统计格式 格式

i = 0

table = {}

source = open(fileName,"r")

result = open(resultName,"w")

while i < lineNums:

line = source.readline()

line = line.rstrip('\n')

print line

words = line.split(" ") #空格分隔

print str(words).decode('string_escape') #list显示中文

#字典插入与赋值

for word in words:

if word!="" and table.has_key(word): #如果存在次数加1

num = table[word]

table[word] = num + 1

elif word!="": #否则初值为1

table[word] = 1

i = i + 1

#键值从大到小排序 函数原型:sorted(dic,value,reverse)

dic = sorted(table.iteritems(), key = lambda asd:asd[1], reverse = True)

for i in range(len(dic)):

#print 'key=%s, value=%s' % (dic[i][0],dic[i][1])

result.write("\n")

return dic

except Exception,e:

print 'Error:',e

finally:

source.close()

result.close()

print 'END\n\n'

''' ------------------------------------------------------- '''

#统计关键词及个数 并计算相似度

def MergeKeys(dic1,dic2):

#合并关键词 采用三个数组实现

arrayKey = []

for i in range(len(dic1)):

arrayKey.append(dic1[i][0]) #向数组中添加元素

for i in range(len(dic2)):

if dic2[i][0] in arrayKey:

print 'has_key',dic2[i][0]

else: #合并

arrayKey.append(dic2[i][0])

else:

print '\n\n'

test = str(arrayKey).decode('string_escape') #字符转换

print test

#计算词频 infobox可忽略TF-IDF

arrayNum1 = [0]*len(arrayKey)

arrayNum2 = [0]*len(arrayKey)

#赋值arrayNum1

for i in range(len(dic1)):

key = dic1[i][0]

value = dic1[i][1]

j = 0

while j < len(arrayKey):

if key == arrayKey[j]:

arrayNum1[j] = value

break

else:

j = j + 1

#赋值arrayNum2

for i in range(len(dic2)):

key = dic2[i][0]

value = dic2[i][1]

j = 0

while j < len(arrayKey):

if key == arrayKey[j]:

arrayNum2[j] = value

break

else:

j = j + 1

print arrayNum1

print arrayNum2

print len(arrayNum1),len(arrayNum2),len(arrayKey)

#计算两个向量的点积

x = 0

i = 0

while i < len(arrayKey):

x = x + arrayNum1[i] * arrayNum2[i]

i = i + 1

print x

#计算两个向量的模

i = 0

sq1 = 0

while i < len(arrayKey):

sq1 = sq1 + arrayNum1[i] * arrayNum1[i] #pow(a,2)

i = i + 1

print sq1

i = 0

sq2 = 0

while i < len(arrayKey):

sq2 = sq2 + arrayNum2[i] * arrayNum2[i]

i = i + 1

print sq2

result = float(x) / ( math.sqrt(sq1) * math.sqrt(sq2) )

return result

''' -------------------------------------------------------

基本步骤:

1.分别统计两个文档的关键词

2.两篇文章的关键词合并成一个集合,相同的合并,不同的添加

3.计算每篇文章对于这个集合的词的词频 TF-IDF算法计算权重

4.生成两篇文章各自的词频向量

5.计算两个向量的余弦相似度,值越大表示越相似

------------------------------------------------------- '''

#主函数

def main():

#计算文档1-百度的关键词及个数

fileName1 = "BaiduSpider.txt"

resultName1 = "Result_Key_BD.txt"

dic1 = CountKey(fileName1, resultName1)

#计算文档2-互动的关键词及个数

fileName2 = "HudongSpider\\001.txt"

resultName2 = "HudongSpider\\Result_Key_001.txt"

dic2 = CountKey(fileName2, resultName2)

#合并两篇文章的关键词及相似度计算

result = MergeKeys(dic1, dic2)

print result

if __name__ == '__main__':

main()

其中由于只需要计算InfoBox消息盒的相似度,不会存在一些故不需要计算TF-IDF值,通过词频就可以表示权重,在代码中简单添加循环后,可以计算百度百科的“故宫”与互动百科不同实体的相似度,运行结果如下所示,可以发现“北京故宫”和“故宫”相似度最高。这也是简单的实体对齐。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值