智能文章系统实战-人工智能机器学习之内容推荐(12)
admin 发布于:2018-7-1 10:49 有 2659 人浏览,获得评论 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]#
