发布时间:2019-07-09 09:32:48编辑:auto阅读(1575)
转自臭脚丫丫博客,觉得有用,博主貌似关博客了,可惜。
最近写了个根据结巴分词后的结果,两两对比分词后的集合,根据雅比克距离 = 集合的交集 / 集合的并集,计算出距离最大的前10个结果,并考虑到同义词。最后每日计算,存入数据库,用程序调用。
#最近写了个根据结巴分词后的结果,两两对比分词后的集合,根据雅比克距离 = 集合的交集 / 集合的并集,计算出距离最大的前10个结果,并考虑到同义词。最后每日计算,存入数据库,用程序调用。 # coding=utf-8 import sys reload(sys) import MySQLdb sys.setdefaultencoding('utf-8') sys.path.append('../') import jieba jieba.initialize() jieba.load_userdict("userdict.txt") import jieba.analyse import re import operator import string f_ex = open('words.txt','rb') #排除词 f_out = open('output.txt','wb') words = [line.strip() for line in f_ex.readlines()] #python独特的列表解析 conn = MySQLdb.connect(host="localhost",user="root",passwd="",db="root",charset="utf8") cursor = conn.cursor() cursor.execute("select a.id,a.title,a.description from v9_ask_a a limit 10") data = cursor.fetchall() #取所有结果 for x in data: f_out.write(str(x[0]).decode("utf-8")+'\t'+str(x[1]).decode("utf-8")+'\t') title = str(x[1]).decode("utf-8") tags_title = jieba.analyse.extract_tags(title, topK=10) for title_ex in tags_title: for title_word in words: if title_word.decode('gbk') == title_ex: title_ex = '' if title_ex != '': f_out.write(title_ex+'|') f_out.write('\r\n') f_ex.close() f_out.close() cursor.execute("select * from v9_similar") #从数据库里取相似词集合 similar = cursor.fetchall() newdata = {} for similardata in similar: wordslist = similardata[1].decode("utf-8").split(',') for wordx in wordslist: newdata.setdefault(similardata[0],[]).append(wordx) #字典的一键多值,用列表作为字典的值 f_out = file('output.txt','rb') result = f_out.readlines() list1 = [] list2 = [] for x in result: relate_table = x.split('\t') list1.append(relate_table[0]) list2.append(relate_table[2]) list3 = dict(zip(list1,list2)) #组合2个列表为字典 dic = {} for x in list3: similarnum1 = [] list3x = list3[x].decode("utf-8") new1 = list3x.split('|') for new1x in new1: for b in newdata: for c in newdata[b]: if c.decode("utf-8") == new1x: similarnum1.append(b) #将相似词的id写入到列表1 for y in list3: similarnum2 = [] if list3[x] != list3[y]: list3y = list3[y].decode("utf-8") new2 = list3y.split('|') for new2x in new2: for e in newdata: for f in newdata[e]: if f.decode("utf-8") == new2x: similarnum2.append(e) #将相似词的id写入到列表2 jiao = len(list(set(new1)&set(new2))) #取2个集合的交集 bing = len(list(set(new1)|set(new2))) #取2个集合的并集 simlen = len(list(set(similarnum1)&set(similarnum2))) #取对比两个集合在相似词集合的交集 jiao+=simlen bing-=simlen result = float(jiao)/float(bing) #计算结果要先进行转换 dic.setdefault(x, { })[y] = result #字典的一键多值,用子字典作为字典的值 dic2 = {} for x in dic: dic1 = dic[x] sorted_x = sorted(dic1.iteritems(), key=lambda dic1 : dic1[1], reverse=True) #将字典的键值进行降序排列 sorted_x = sorted_x[0:10] #取最大的10个键值 for y in sorted_x: y = str(y) z = y.split("'")[1] dic2.setdefault(x, []).append(z) for x in dic2: y = ",".join(dic2[x]) #将子字典转换成字符串插入数据库 x = string.atoi(x) #将字符串转换成整数 value = [y,x] cursor.execute('update v9_ask_a set relate_id=%s where id=%s',value) conn.commit() cursor.close() conn.close()
觉得很实用,先留下来。。
1、phpcms设置
先在扩展里面添加一下工作流,然后设置栏目发布需要审核就行
2、python计算相关性
计算相关性的方法可以用tf-idf与余弦相似性:http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html
我暂时用的是雅比克距离 = 集合的交集 / 集合的并集(英文名叫啥不清楚了),并且考虑到同义词。
先将文章进行分词,用结巴分词自带的tf-idf提取最重要的10个分词,然后再一一对比进行计算。
雅比克距离计算没啥好说的,我来说下计算的时候怎么考虑到同义词。
(1)在数据库里面新建表v9_similar,然后有2个字段:id,words,words存储的是同义词,用逗号隔开。
(2)将id和words存在字典里面,一键多值
cursor.execute("select * from v9_similar") similar = cursor.fetchall() newdata = {} //newdata字典用于存储近义词 for similardata in similar: wordslist =similardata[1].decode("utf-8").split(',') for wordx in wordslist: newdata.setdefault(similardata[0],[]).append(wordx)
(3)将文章的前10个分词和同义词进行对比,如果有在同义词里面出现,那么记录下改同义词的id
for x in list3: //将要计算的所有文章分词后组成列表,用"|"分割 similarnum1 = [] list3x = list3[x].decode("utf-8") new1 = list3x.split('|') for new1x in new1: for b in newdata: for c in newdata: if c.decode("utf-8") == new1x: similarnum1.append(b) //如果有同义词,那么将id存储到列表里
这样,每篇文章与同义词进行对比的时候,就可以形成每篇文章的相似id列表。然后再将每篇文章的相似词列表进行取交集,就可以计算出2篇文章有多少分词是相似的。
jiao = len(list(set(new1)&set(new2))) bing = len(list(set(new1)|set(new2))) simlen = len(list(set(similarnum1)&set(similarnum2))) //simlen就是将两篇文章进行相似ID列表取交集 jiao+=simlen //取交集的时候加上simlen bing-=simlen //取并集的时候减去simlen result = float(jiao)/float(bing)
(4)计算完结果后再将相似文章的id存入数据库表,用逗号隔开
value = [y,x] cursor.execute('update v9_news set relate=%s where id=%s',value)
3、phpcms模板调用计算好的相似文章id
{pc:get sql="select * from v9_news where (id=$id and status=99)"} {loop $data $uu} {if $uu[relate] != ''} //判断是否为空,如果是相关性没有计算好,导致这个字段为空值,就会出错 {php $URLid=explode(',',$uu[relate]);} //将相似文章id用逗号分隔,取ID {loop $URLid $ab} {pc:get sql="select * from v9_news where id=$ab"} {loop $data $bc} <a href="{$bc[url]}" target="_blank">{$bc[title]}</a> {/loop} {/pc} {/loop} {/if} {/loop} {/pc}
4、python随机取一个审核状态的文章,将status字段设置为99(审核状态为1),就可以发布了。
如果是生成的静态html文章,那么还需要要再一步,那就是批量生成已经审核,但是没有生成静态页面的文章。
需要修改phpcms/modules/content/目录下的create_html.php
和phpcms/modules/content/class/下的url.class.php,html.class.php
然后再根据mvc框架,传参就行,类似:
5、最后一步就是将python定时更新脚本挂在linux服务器上了,需要生成静态页面定时访问那个url就行了。
上一篇: python模块SocketServer
下一篇: python调用调用Linux命令
47479
45781
36780
34300
28950
25585
24431
19602
19089
17623
5454°
6037°
5553°
5628°
6554°
5365°
5366°
5872°
5845°
7159°