从0构建AI推荐系统demo(数据准备)

前言

推荐系统一直以来都是人工智能领域中较为火热的研究方向之一,最近公司需要构建常见的资讯类推荐系统,本人也从无到有、从0开始构建AI推荐系统demo版。此篇主要讲述最基本的数据准备中,最最最最基本的常用操作。

一、数据准备

记得之前看到过一句话,大致意思是说:数据的质量决定系统(功能)的上限,算法与代码只是不断趋近这个上限而已。

这话说的特别有道理,优质的数据源可以极大的提高AI训练的效率。目前来说,数据的主要来源如下:

数据主要来源:

  1. 网络爬虫获取;
  2. 开源数据集提供;
  3. 购买优质的数据源;
  4. 等等等等

数据的主要种类:

  • 1. 交易数据。
  • 主要包括电子商务数据、互联网点击数据、销售系统数据、CRM)系统数据、公司的生产数据、库存数据、订单数据、供应链数据等。  
  • 2. 移动通信数据。
  • 移动设备上的软件能够追踪和沟通无数事件,从运用软件储存的交易数据(如搜索产品的记录事件)到个人信息资料或状态报告事件(如地点变更即报告一个新的地理编码)等。  
  • 3.人为数据。
  • 主要包括电子邮件、文档、图片、音频、视频,以及通过微信、博客、推特、维基、脸书、Linkedin等社交媒体产生的数据流。这些数据大多数为非结构性数据,需要用文本分析功能进行分析。
  • 4.机器和传感器数据。
  • 主要包括来自感应器、量表和其他设施的数据、定位/GPS系统数据等。例如智能温度控制器、智能电表、工厂机器和连接互联网的家用电器的数据。来自物联网的数据可以用于构建分析模型,连续监测预测性行为(如当传感器值表示有问题时进行识别)等。  

本文使用的数据主要为:

1. 前期采用网络爬虫获取数据;

2. 中期寻找网上开源数据集中的数据参与训练;

3. 后期...后期再说...

二、基本数据获取

针对目标数据源不同,获取的方式也会有所差异。本系列文章主要获取金融财经中资讯类的新闻数据,用以构造最基本的数据层。

0. 网上开源数据集

这是非常快速有效获取数据的方法之一,一般数据量都很大,并且字段丰富,内容质量也可以,但是局限多多,别的不说,由于这些好的数据源来自国外,下载速度异常的慢,并且N次因为网络错误导致下载失败,还好本人有耐心。。。哎,说多了都是泪,坚持下载到最后,得到约31万条数据,解压前570M,解压后一个多G,都是新闻类的资讯,抽样来看,大部分是前年和去年的,每条资讯以json文件的格式保存,如下所示:

{
	"organizations": [],
	"uuid": "245bd81f0ae706b4f18a43ede70ed85b80c581a8",
	"thread": {
		"social": {
			"gplus": {
				"shares": 0
			},
			"pinterest": {
				"shares": 0
			},
			"vk": {
				"shares": 0
			},
			"linkedin": {
				"shares": 0
			},
			"facebook": {
				"likes": 0,
				"shares": 0,
				"comments": 0
			},
			"stumbledupon": {
				"shares": 0
			}
		},
		"site_full": "news.eastday.com",
		"main_image": "",
		"site_section": "",
		"section_title": "",
		"url": "http://news.eastday.com/eastday/13news/auto/news/world/20161002/u7ai6083740.html",
		"country": "CN",
		"domain_rank": 363,
		"title": "韩国宣布“萨德”最终部署地引发新一轮抗议",
		"performance_score": 0,
		"site": "eastday.com",
		"participants_count": 0,
		"title_full": "韩国宣布“萨德”最终部署地引发新一轮抗议",
		"spam_score": 0.077,
		"site_type": "news",
		"published": "2016-10-02T08:00:00.000+03:00",
		"replies_count": 0,
		"uuid": "245bd81f0ae706b4f18a43ede70ed85b80c581a8"
	},
	"author": "",
	"url": "http://news.eastday.com/eastday/13news/auto/news/world/20161002/u7ai6083740.html",
	"ord_in_thread": 0,
	"title": "韩国宣布“萨德”最终部署地引发新一轮抗议",
	"locations": [],
	"entities": {
		"persons": [],
		"locations": [],
		"organizations": []
	},
	"highlightText": "",
	"language": "chinese",
	"persons": [],
	"text": "\n2016年10月2日 15:25 \n\n韩国民间团体30日在国防部门前举行抗议“萨德”示威活动。摄影:人民网记者马菲 \n人民网韩国10月2日电 韩国国防部30日宣布,将“萨德”反导系统(末段高空区域防御系统)的“最终”部署地确定为庆尚北道星州郡的星州高尔夫球场。 \n自韩国政府7月13日宣布将“萨德”部署在庆尚北道星州郡星山炮台以来,星州居民强烈抗议的呼声便从未间断。迫于压力,韩国国防部于8月下旬选出星州郡内另外3处部署候选地进行考察,分别为星州高尔夫球场、厌俗山和喜鹊山。 \n韩国国防部长官韩民求30日当天向国会各党派说明情况,并提交了有关评估报告。报告称,与其他两个候选地相比,星州高尔夫球场具备必要的基础设施,能够保证“萨德”反导系统在2017年底完成部署。 \n而就在两个多月前,韩国国防部宣布星山炮台为“萨德”部署地时,也坚称这里是最佳部署地点。有舆论批评认为,政府在重要的国家安全决策上朝令夕改,加重了混乱局面,并损害了政府的透明性和信任度。 \n星州高尔夫球场位于星州郡政府办公楼以北18公里处,海拔680米,高于海拔383米的星山炮台。韩国国防部表示,星州高尔夫球场附近民宅较少,有助于平息民众对“萨德”雷达辐射危害的质疑,且面积也比星山炮台大,更便于架设雷达和拦截系统。 \n据称,韩国国防部下一步将与拥有星州高尔夫球场产权的韩国乐天集团开展购地谈判。韩媒指出,星州高尔夫球场的购置费用将超过1000亿韩元(1美元约合1101韩元),且须由韩国政府全部承担。韩国政府能否与乐天集团达成协议,以及能否经过国会批准获得购地预算仍存在诸多变数,因此部署“萨德”仍将面临挑战。 \n尽管韩国政府更换“萨德”部署地是为了消除民众的不满情绪,然而韩国国内抗议“萨德”的声浪却并未因此平息。在星州高尔夫球场部署“萨德”后,雷达将会朝向金泉市方向,金泉市居民对此表示出强烈抗议。在未正式宣布“萨德”新的部署地之前,金泉市民众已举行了1万余人参加的反对部署“萨德”动员大会,并多次举行烛光集会表达抗议。 \n金泉市人口超过14万,大约是星州郡的3倍。韩媒称,一旦部署地选在星州高尔夫球场,金泉市居民将进行全面抗议,当地居民对于部署“萨德”的强烈反对态度将使韩国政府面临更大压力。30日当天,国防部官员前往金泉市就更改“萨德”部署地的决定进行说明,但当地官员拒绝了会面。 \n自韩国宣布部署“萨德”反导系统以来,民众多次在国防部门前进行抗议活动。30日中午,本报记者在国防部门前看到,众多警察在该处严加把守,并开始在门前设置多层铁丝网以防止抗议人群靠近。下午1点半左右,由韩国多个市民团体共同成立的“反对部署‘萨德’全国联盟”在国防部门前举行反对“萨德”抗议活动,人们手举反对“萨德”的标语,高呼口号要求政府撤回部署决定。 \n“韩国不存在‘萨德’的最佳部署地,撤回部署决定才是唯一有效的办法。”该联盟在国防部门前宣读声明称,国防部现在推翻了自己之前的说法,又表示星州高尔夫球场更适合部署“萨德”,这完全没有任何说服力,说明其在确定部署地时根本没有明确的考察标准。韩国政府无视民众的生存安全,无视与周边国家关系的恶化,强行推进部署萨德,破坏地区和平,这绝对不能容忍,一定要阻止在韩国部署“萨德”。 \n“部署‘萨德’到底是为了保护谁的安全?”韩国女大学生郑有龄在抗议活动中激愤地表示,不管是星州还是金泉,韩国的任何一个地方都不适合部署萨德。韩国已有许多专家论证过在韩国部署“萨德”并不能保卫韩国安全,然而国防部却完全无视这些声音,一意孤行坚持要部署“萨德”,这到底是为了保护韩国国民的国防部,还是为了保护美国的国防部? \n当天下午,韩国五大宗教之一的圆佛教也在国防部门前举行了反对“萨德”的抗议活动。 \n在韩国国防部的对面坐落着韩国战争纪念馆,二者相对而立。在战争纪念馆的广场上,孩子们的嬉笑声夹杂着远处的抗议声,听起来令人唏嘘。战争纪念馆里,民众回顾那段悲痛的历史,期盼和平,祈祷战争不再重演;国防部里,部署“萨德”、确定“萨德”部署地等决定却接连传出,不断加剧紧张局势。两个地方只有一路之隔。 \n\n\n韩国民间团体30日在国防部门前举行抗议“萨德”示威活动。摄影:人民网记者马菲 \n上一页 下一页 \n\n韩国民间团体30日在国防部门前举行抗议“萨德”示威活动。摄影:人民网记者马菲 \n上一页 下一页 \n\n韩国国防部正门。摄影:人民网记者马菲 \n上一页 下一页 \n\n警察在国防部门前把守以防抗议人群靠近。摄影:人民网记者马菲 \n上一页 下一页 \n\n抗议人群将反对萨德的标语贴在国防部门前的铁丝网上。摄影:人民网记者马菲 \n上一页 下一页 \n\n韩国民间团体30日在国防部门前举行抗议“萨德”示威活动。摄影:人民网记者马菲 \n上一页 下一页 \n\n位于韩国国防部对面的韩国战争纪念馆。摄影:人民网记者马菲 \n上一页 下一页 \n\n韩国小朋友在战争纪念馆广场上嬉戏。摄影:人民网记者马菲 \n",
	"external_links": [],
	"published": "2016-10-02T08:00:00.000+03:00",
	"crawled": "2016-10-02T11:45:54.531+03:00",
	"highlightTitle": ""
}

由于数据量过大,所以每个资讯的内容多种多样,在设计数据清洗时经常会发生意想不到的情况,本人目前只简单的处理一部分,毕竟重点是先搭建出来一个推荐系统的demo,至于数据量,在算法层面上会进行进一步处理,等有时间了,再进行深层次的挖掘。

1. 通过JavaScript在前端获取(仅供参考)

讲真,要不是有特殊的数据来源,本人都不知道JavaScript在前端下载数据这么6...,爬虫使用久了之后,体验很深的一点在于网站的请求很费解,费时费力,JavaScript方式虽然简单,但是局限性特别大。献上代码如下:

function downloadData(data){
    var fso = new ActiveXObject("Scripting.FileSystemObject");
	var f=fso.createtextfile("D:\a.txt",2,true); 
	f.write(data); 
	f.close();
}

如代码所示,JavaScript中采用的是新建ActiveXObject对象进行文件操作,蛋疼的是,ActiveXObject对象目前只对IE浏览器有效!!!亲测在chrome浏览器、Microsoft Edge浏览器均无法使用,网传Firefox浏览器同样无法使用。

ActiveXObject对象相关的官方介绍连接:ActiveObject对象官方介绍

newObj = new ActiveXObject(servername.typename[, location])

JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用。

ActiveXObject 对象语法有这些部分:
其中newObj是必选项。要赋值为 ActiveXObject 的变量名。
servername是必选项。提供该对象的应用程序的名称。
typename是必选项。要创建的对象的类型或类。
location是可选项。创建该对象的网络服务器的名称。
Automation服务器至少提供一类对象,例如字处理应用程序可能提供应用程序对象、文档对象和工具栏对象。

使用JScript读写本地文件时,会使用Scripting.FileSystemObject控件,创建ActiveXObject对象。

注:ActiveX简介

 ActiveX 控件广泛用于 Internet。它们可以通过提供视频、动画内容等来增加浏览的乐趣。不过,这些程序可能出问题或者向您提供不需要的内容。在某些情况下,这些程序可被用来以您不允许的方式从计算机收集信息、破坏您的计算机上的数据、在未经您同意的情况下在您的计算机上安装软件或者允许他人远程控制您的计算机。一般软件需要用户单独下载然后执行安装,而ActiveX插件是当用户浏览到特定的网页时,IE浏览器即可自动下载并提示用户安装。 ActiveX插件安装的一个前提是必须经过用户的同意及确认。考虑到这些风险,您应该在完全信任发行商的情况下才安装这些程序。

异常处理:

异常名:
     “Automation 服务器不能创建对象”的异常
原因:
     使用JScript读写本地文件时,会使用Scripting.FileSystemObject控件。
     但是IE默认是不允许运行这类“未标记为安全执行脚本的ActiveX控件”的。
     因此执行下行代码时:
        fso = new ActiveXObject("Scripting.FileSystemObject");
     会抛出异常。

异常解决方法:

在IE浏览器中并不是默认打开相应的ActiveX的相关控件的,需要手动打开,方法如下:

1. 在IE浏览器中打开Internet选项卡:

2. 安全栏中找到自定义级别,打开后找到ActiveX空间相关的内容,如下:

将默认禁用的相关操作打开即可。

注意:

  • 打开禁用的ActiveX控件具有一定的风险性,为了防止恶意脚本通过修改后的IE浏览器修改、操控本地文件,建议启用此选项调试代码、下载数据后,恢复默认选择!!!

2. 通过爬虫获取(主要推荐)

通过爬虫获取数据,此内容较多,将通过另外单独的文章分析。

3. 最最基础代码分析

'''
从接口中获取除了主要内容之外的数据,写入MySQL
'''

import pymysql

def write2mysql(list):
    conn = pymysql.connect(host="localhost", user='root', password='123456789', database = 'news', charset='utf8')
    cursor = conn.cursor();
    sql = "INSERT INTO docList(news_id, title, time, source, abstract) values " \
          "('%s','%s','%s','%s','%s')" % (list[0], list[1], list[2], list[3], list[4])
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        conn.rollback()

# 要求文件为utf-8类型
def cleanData(dataFilePath):
    with open(dataFilePath, "r",encoding="utf-8-sig") as f:
        allData = f.read()
        cleandData = allData.replace("||", "|")
        dataList = cleandData.split("|,")
        for oneData in dataList:
            try:
                oneDataList = oneData.split("|")
                resultDataList = [oneDataList[0], oneDataList[1], oneDataList[2], oneDataList[3], oneDataList[5]]
                write2mysql(resultDataList)
            except:
                continue

if __name__ == '__main__':
    dataFilePath = "D:/data.txt"
    cleanData(dataFilePath)

注意点:日期、去除 \ufeff、MySQL去重、Python字符串格式

  • 日期

由于获取的日期为字符串格式:“2018-08-23 21:21”,直接采用字符串存储,没有转换成时间戳等形式。但,可能后期存在问题。

  • 去除 \ufeff

去除 \ufeff,最直接的办法是打开文件时,将编码格式有 encoding= “utf-8” 改为 encoding="utf-8-sig"。

  • Python字符串格式

字符串格式匹配,%s、%d、%f 等的使用,省去构造MySQL语句的书写模式。

  • MySQL去重

去除重复的相同数据,保存唯一ID最小的数据。

1. 找出所有重复记录的ID
SELECT
	(唯一ID)
FROM
	TABLE_NAME
WHERE
	-- 根据筛选字段选出重复的数据
	(筛选字段) IN (
		SELECT
			(筛选字段)
		FROM
			TABLE_NAME
		GROUP BY
			(筛选字段)
		HAVING
			count(筛选字段) > 1
	)
AND 
	(唯一ID) NOT IN (
		SELECT
			min(唯一ID)
		FROM
			TABLE_NAME
		GROUP BY
			(筛选字段)
		HAVING
			count(筛选字段) > 1
)

2. 删除1中重复的数据
DELETE FROM TABLE_NAME WHERE (唯一ID) IN (.., .., 1中的ID结果 .., ..)

猜你喜欢

转载自blog.csdn.net/HeyShHeyou/article/details/81987177