2021-04-08

本文详细介绍了如何利用大数据对法律咨询类网页的内部点击行为进行统计分析,包括网页类型分布、各类网页点击情况,以及数据预处理、用户-物品矩阵构建、杰卡德相似度计算和模型评价。通过实际操作展示了从数据读取到模型构建的完整流程。
摘要由CSDN通过智能技术生成

系列文章目录

**

大数据智能推荐(法律)

**


前言

本文大量参考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,若有侵权,将马上删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值