Python创建文本相似度查询服务

原创
2017/01/20 22:52
阅读数 195

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


import pymongo
import codecs,sys
from pymongo import MongoClient
import jieba
from gensim import corpora, models, similarities
import nltk
import jieba.analyse
from nltk.tokenize import word_tokenize
from pprint import pprint # pretty-printer
from flask import Flask,request

import trainkick

print "Flask server..."
app = Flask(__name__)
app.config.from_object(__name__)
#flatpages = FlatPages(app)

questid=''

@app.route('/queryill')
def index():
questid=request.args.get("uuid",'')
queryit(questid)
return 'success'


#reload(sys)
#sys.setdefaultencoding('utf-8')
#look2 = codecs.lookup("utf-8")

kickpath="/root/python/"
conn = MongoClient("xxx",27017)
db = conn.health
db.authenticate("xxx","xxx3")


dics=[]
dits={}
labels={}
count=1
mydoclist =[]
courses=[]

uuids=[]



content = db.kickchufang.find({})
for in content:
line=str(i['chufang'].encode("gb2312"))
uuid=i['uuid']
uuids.append(uuid)
print uuid,line
courses.append(line)
courses_name = courses



#lib_texts =trainkick. pre_process_cn(courses)
#库建立完成 -- 这部分可能数据很大,可以预先处理好,存储起来
dictionary = corpora.Dictionary.load(kickpath+'kick.dict')
print dictionary
lsi=models.LsiModel.load(kickpath+"kick.lsi")
index=similarities.MatrixSimilarity.load(kickpath+"kick.index")


def queryit(questionid):
# 要处理的对象登场
record = db.kickasking.find_one({'uuid': questionid})
if (record):
line = str(record['desc'].encode("gb2312"))
print line
questions = [line]
target_courses = questions # [u'石膏']
# print "target_courses",target_courses
target_text = trainkick.pre_process_cn(target_courses, low_freq_filter=False)
"""
test similary
"""

# 选择一个基准数据
ml_course = target_text[0]
print "ml_course", ml_course

# 词袋处理
ml_bow = dictionary.doc2bow(ml_course)
print "ml_bow", ml_bow

# 在上面选择的模型数据 lsi 中,计算其他数据与其的相似度
ml_lsi = lsi[ml_bow] # ml_lsi 形式如 (topic_id, topic_value)
sims = index[ml_lsi] # sims 是最终结果了, index[xxx] 调用内置方法 __getitem__() 来计算ml_lsi

# 排序,为输出方便
sort_sims = sorted(enumerate(sims), key=lambda item: -item[1])

# 查看结果
print sort_sims[0:10# 看下前10个最相似的,第一个是基准数据自身
print uuids[sort_sims[0][0]], sort_sims[0][1]
print uuids[sort_sims[1][0]], sort_sims[1][1]
print uuids[sort_sims[2][0]], sort_sims[2][1]
doc = [{"questid": questionid, "chufangid": uuids[sort_sims[0][0]], "score"float(sort_sims[0][1])}]
db.kickanswer.insert(doc)

# print sort_sims[1][1] #看下实际最相似的数据叫什么
# print courses_name[sort_sims[2][0]] #看下实际最相似的数据叫什么
# print courses_name[sort_sims[3][0]] #看下实际最相似的数据叫什么


if __name__ == '__main__':
app.run(host='0.0.0.0'port=9000)

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部