智能文章系统实战-人工智能机器学习之内容推荐(12)

admin 发布于:2018-7-1 10:49  有 1903 人浏览,获得评论 0 条  

1. 安装环境

#pip3 install pymysql
#pip3 install jieba
#pip3 install numpy
#pip3 install scipy
#pip3 install sklearn
#pip3 install pandas

 

 

2.内容推荐代码代码

 

#!/usr/bin/env python
#-*- coding:utf-8 -*-


#安装环境
#pip3 install pymysql
#pip3 install jieba
#pip3 install numpy
#pip3 install scipy
#pip3 install sklearn
#pip3 install pandas


#引入库
import pandas as pd #分词
import pymysql.cursors  #数据库
import re #正则过滤
import jieba #分词
from sklearn.feature_extraction.text import TfidfVectorizer  #结构化表示--向量空间模型
from sklearn.metrics.pairwise import linear_kernel



#初始化内容和分类的列表
dataList=[]



#定义函数,HTML转化为分词后用空格分离的字符串
def htmlToWords(html):
	reObject = re.compile(r'<[^>]+>',re.S)
	#过滤HTML
	text = reObject.sub('',html)
	#过滤\r\n
	text = re.sub('\t|\n|\r','',text)
	#分词
	words=jieba.cut(text)
	#把分词数组组成字符串返回
	return " ".join(words)
	



# 连接MySQL数据库
connection = pymysql.connect(host='localhost', port=3306, user='root', password='', db='article', charset='utf8', cursorclass=pymysql.cursors.DictCursor)

# 通过cursor创建游标
cursor = connection.cursor()

# 执行数据查询
sql = "SELECT `id`, `title`,`content` FROM `article` order by id desc limit 200"
cursor.execute(sql)

#查询数据库多条数据
result = cursor.fetchall()
for data in result:
    
	#HTML转化为分词后用空格分离的字符串赋值给words,此处以 标题title 进行相似度计算,也可以 文章内容content 进行相似度计算.
	item={'id':data['id'],'words':htmlToWords(data['title'])}
	dataList.append(item)
	
	




#创建数据集
ds = pd.DataFrame(dataList)

#将文本数据转化成特征向量
tf = TfidfVectorizer(analyzer='word', min_df=0, stop_words='english')
tfidf_matrix = tf.fit_transform(ds['words'])

#人工智能进行相似度计算
cosine_similarities = linear_kernel(tfidf_matrix, tfidf_matrix)
#print(cosine_similarities)



#相似结果列表
resultList={}

#每篇文章和其他文章的相似度
for idx, row in ds.iterrows():
	
	#排序倒序,取前 5 篇文章相似的
	similar_indices = cosine_similarities[idx].argsort()[:-6:-1]
	
	#输出每篇文章相似的文章ID和文章相似度
	similar_items = [(cosine_similarities[idx][i], ds['id'][i]) for i in similar_indices]
	
	#用字典存储每篇文章ID对应的相似度结果
	resultList[row['id']]=similar_items

#输出每篇文章ID对应的相似度结果
#print(resultList)


#数据和文章ID=14 标题相似的 文章标题
resultDs=resultList[14]
print("标题相似的结果: ",resultDs)
for row in resultDs:
	
	#输出相似度>0的文章
	if row[0]>0:
		# 执行数据查询
		sql = "SELECT `id`, `title` FROM `article` WHERE id='%d' LIMIT 1"%(row[1])
		cursor.execute(sql)
		data = cursor.fetchone()
		
		#打印结果
		print(data)
		print("相似度=",row[0])
	
# 关闭数据连接
connection.close()

 

 

3. 结果输出

[root@bogon python]# python3 recommend.py 
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 1.564 seconds.
Prefix dict has been built succesfully.
标题相似的结果:  [(1.0, 14), (0.23201380925542303, 67), (0.215961061528388, 11), (0.09344442103258274, 29), (0.0, 1)]
{'id': 14, 'title': '个税大利好!起征点调至每年6万 增加专项扣除'}
相似度= 1.0
{'id': 67, 'title': '个税起征点拟上调至每年6万 第7次修正百姓获益几何?'}
相似度= 0.23201380925542303
{'id': 11, 'title': '个税起征点提高利好买房?月供1万个税可降2000多元'}
相似度= 0.215961061528388
{'id': 29, 'title': '个税起征点拟提至每月5000元 月薪万元能省多少?'}
相似度= 0.09344442103258274
[root@bogon python]#