系列文章目录
**
大数据智能推荐(法律)
**
大数据智能推荐(法律)
前言
本文大量参考https://blog.csdn.net/weixin_47922824/article/details/109811258
一、步骤
1.数据读取
代码如下(示例):
import pandas as pd
data=pd.read_csv('D:/shujuwajue/all_gzdata.csv',encoding='gbk')
2.数据探索与分析
2.1简单的数据探索
目的是查看数据的大致类型和情况,方便下一步处理
代码如下(示例):
data.head()
data.shape
data.columns
data.dtypes
看完数据,发现网页的特征较为明显,对网页数据进行探索
2.2网页类型的统计分析
vc_url = data.fullURLId.astype(str).str[:3].value_counts() # 统计不同类型网页的访问次数
x=vc_url.index
y=vc_url.values
#绘制条形图
import matplotlib.pyplot as plt
plt.figure(figsize=(8,8),dpi=80)
plt.title('不同类型网页的访问次数')
plt.rcParams['font.sans-serif']='FangSong'
plt.ylim(0,500000)
plt.xlabel('网页类型')#添加x轴标签
plt.ylabel('次数')#添加y轴标签
plt.bar(x,y,color='cyan')
for i,j in zip(x,y):
plt.text(i,j,f'{round(j/data.shape[0],2)}',ha='center',va='bottom')
plt.show()
#自定义一个绘图函数,方便使用
def draw_bar(title=None,xlabel=None,ylabel=None,x=None,y=None,all_d=None):
"""
实现绘制柱状图
param title :标题
param xlabel:x轴标签
param ylabel:y轴标签
param x:x值
param y:y值
param all_d:总数据量
"""
plt.figure(figsize=(8,8),dpi=200)#创建一张空白的画布
plt.title(title)#添加标签
plt.rcParams["font.sans-serif"]="FangSong"#设置正常显示中文,黑体(SimHei)(FangSong:仿宋)
plt.xlabel(xlabel)#添加x轴标签
plt.ylabel(ylabel)#添加y轴标签
plt.bar(x,y,color='green')#绘制柱状图
for i,j in zip(x,y):
plt.text(i,j,"%.3f"%round(j/all_d,3),ha="center",va="bottom")#表现占比
plt.show()#展示图表
2.21统计分析咨询类型网页内部点击情况
观察数据后,对以下数据进行处理
data.fullURLId=data.fullURLId.astype(str)#将整型转化为字符串类型
data_101=data[data.fullURLId.str[:3]=='101']#筛选101字符类型
vc_101=data_101.fullURLId.value_counts()#统计资讯类型网页内部的点击情况
#绘制条形图
draw_bar('咨询类型网页内部的点击情况','网页类型','次数',vc_101.index,vc_101.values,data_101.shape[0])
2.22统计分析其他类型网页内部点击情况
#1. 统计与咨询相关——网页标题包含‘查询|咨询|法律快车法律经验|法律快搜’的网页
data_199=data[data.fullURLId.str[:3]=='199']
data_199.fullURLId.value_counts()
zx=data_199.pageTitle.str.contains('查询|咨询|法律快车法律经验|法律快搜').sum()
#2.. 统计与知识相关——网页网址包含‘faguizt’的网页或者网页标题包含‘法律知识|百科’的网页或者网页标题包含专题但不包含咨询的网页
data_199.fullURL.str.contains('faguizt')#网页网址包含‘faguizt’的网页
sum([i is not None and('法律知识' in str(i) or '百科' in str(i))for i in
data_199.pageTitle])#网页标题包含‘法律知识|百科’的网页
sum([i is not None and'专题' in str(i) and'咨询'not in str(i)for i in
data_199.pageTitle])#网页标题包含专题但不包含咨询的网页
zs=data_199[data_199.fullURL.str.contains('faguizt')|
([i is not None and('法律知识' in str(i) or '百科' in str(i))for i in
data_199.pageTitle])|
([i is not None and'专题' in str(i) and'咨询'not in str(i)for i in
data_199.pageTitle])].shape[0]
#3. 统计与律师相关——网页标题包含'律师事务所|律师助手'的网页
ls=sum([i is not None and ('律师事务所'in str(i) or '律师助手' in
str(i))for i in data_199.pageTitle])
# 4. 统计中间网页——网页网址包含‘midques’的网页或者网页标题包含‘错误提示页面|地区列表’的网页
zj = sum(data_199.fullURL.str.contains('midques') |
([i is not None and '地区列表' in str(i) for i in data_199.pageTitle]))
#5.其他
qt=data_199.shape[0]-zx-zs-ls-zj
draw_bar('其他类型网页内部点击情况','网页类型','次数',['咨询相关','知识相关',
'律师相关','中间网页','其他'],
[zx,zs,ls,zj,qt],data_199.shape[0])
#探索完数据,进行数据预处理
3.数据预处理
1.删除网页标题包含‘咨询发布成功’的记录
2.删除网页网址包含‘midques’关键字的记录
3.删除律师的行为记录(可通过法律快车-律师助手判断)
4.删除不是网站网页的记录(网页网址不包含‘lawtime’关键字)
5.删除网页网址无‘.html’的记录
6.还原网页网址包含‘?’的网页网址(删除‘?’后面的内容)
7.还原网页网址为翻页的记录
8.删除重复的记录
9.提取婚姻类数据,保留所需字段(因为数据量太大,这里仅仅提取婚姻类,读者可自行改动)
#1.删除网页标题包含‘咨询发布成功’的记录
print('原数据形状',data.shape)
data_new=data[[i is not None and '咨询发布成功' not in str(i) for i in data.pageTitle]]
print('删除网页标题包含‘咨询发布成功’的记录的形状',data_new.shape)
#2.删除网页网址包含‘midques’关键字的记录
data_new=data_new[-data_new.fullURL.str.contains('midques')]
print('删除网页网址包含‘midques’关键字的记录',data_new.shape)
#3.删除律师的行为记录(可通过法律快车-律师助手判断)
data_new=data_new[[i is not None and '法律快车-律师助手' not in str(i) for i in data_new.pageTitle]]
print('删除律师的行为记录后的形状',data_new.shape)
#4.删除不是网站网页的记录(网页网址不包含‘lawtime’关键字)
data_new=data_new[data_new.fullURL.str.contains('lawtime')]
print('删除不是网站网页的记录(网页网址不包含‘lawtime’关键字)后的形状',data_new.shape)
#5.删除网页网址无‘.html’的记录
data_new=data_new[data_new.fullURL.str.contains('.html')]
print('删除网页网址无‘.html’的记录后的形状',data_new.shape)
#6.还原网页网址包含‘?’的网页网址(删除‘?’后面的内容)
import re
data_new.fullURL=[re.sub('\?.*','',i) for i in data_new.fullURL]
#验证
data_new.fullURL.str.contains('\?').sum()
#7.还原网页网址为翻页的记录
data_new.fullURL=[re.sub('_\d{0,2}','',i) for i in data_new.fullURL]
#验证
data_new.fullURL.str.contains('_').sum()
#8.删除重复的记录
data_new.drop_duplicates(inplace=True)
print('去重后的形状',data_new.shape)
#9.提取婚姻类数据,保留所需字段
data_hunyin=data_new[data_new.fullURL.str.contains('hunyin')]
print('提取婚姻类数据,保留所需字段',data_hunyin.shape)
4.数据准备
data_hunyin.shape
# 删除三个月里浏览次数少于3、多于400的用户,并提取用户IP
vc_hy_ip = data_hunyin.realIP.value_counts()
ip = (vc_hy_ip[(vc_hy_ip>3) & (vc_hy_ip<400)]).index.tolist()
# 按照用户ip划分训练集ip、测试集ip(resample)tr_ip,te_ip
import random
random.seed(123) # 设置随机种子
train_ip = random.sample(ip,round(len(ip)*0.8)) # 划分比例:二八
test_ip = [i for i in ip if i not in train_ip]
# 按照划分的训练集ip、测试集ip提取训练集、测试集
train_data = data_hunyin.loc[[i in train_ip for i in data_hunyin.realIP],:]
test_data = data_hunyin.loc[[i in test_ip for i in data_hunyin.realIP],:]
5. 构建用户-物品二元矩阵
train_data.realIP # 用户
train_data.fullURL#物品
train_data['times'] = 1 # 浏览次数
pt = pd.pivot_table(train_data,index='realIP',columns='fullURL',values='times') # 用户-物品二元矩阵
6.自定义杰卡德相似函数
此处选择杰卡德相似函数,也可以选择其他函数
import numpy as np
def jkd(x):
dot1 = np.dot(x.T,x) # 计算两个物品同时被购买的次数
x2=-(x-1)
dot2 = np.dot(x2.T,x) # 计算两个物品只有一个被购买的次数(横轴-b被购买是a不被买次数)
dot3 = dot2.T+dot2 # 计算任一物品被购买的次数(A被购买B没有被购买,B被购买A没有被购买)
dot4=dot1/(dot1+dot3) # 计算物品之间的相似度:两个物品同时被购买的次数(dot1)/(任一物品被购买的次数(dot3)+两个物品同时被购买的次数(dot1))
for i in range(len(dot4)):
dot4[i,i]= 0
return dot4
cor=jkd(pt)
cor=pd.DataFrame(cor)
cor.index=pt.columns
cor.columns = pt.columnns
7.构建测试集浏览字典
test_data.drop_duplicates(inplace=True)
dic_rec={ip:list(test_data.loc[test_data.realIP==ip,'fullURL']) for ip in test_ip}
8.构建评分矩阵
test_data.reset_index(drop=True,inplace=True)#重置index
#构建评分矩阵
rec=pd.DataFrame(index=range(len(test_data)),columns=['IP','URL','rec_URL','T/F'])
rec['IP']=test_data.realIP#用户IP
rec['URL']=test_data.fullURL#已浏览网址
for i in rec.index:
if rec.loc[i,'URL'] in pt.columns:
rec.loc[i,'rec_URL'] = cor.loc[rec.loc[i,'URL'],:].argmax()
rec.loc[i,'T/F']= rec.loc[i,'rec_URL'] in dic_rec[rec.loc[i,'IP']]
模型评价
pre = sum(rec['T/F']==True)/rec.shape[0] # 准确率
因为数据较少故模型不是很精准
总结
本文大量参考https://blog.csdn.net/weixin_47922824/article/details/109811258,若有侵权,将马上删除