Code Monkey home page Code Monkey logo

cldxiang / mining-frequent-pattern-from-search-history Goto Github PK

View Code? Open in Web Editor NEW
31.0 2.0 2.0 1.56 MB

《大数据挖掘技术》@复旦 课程项目,试图从搜狗实验室用户查询日志数据(2008)中找出搜索记录中有较高支持度关键词的频繁二项集。在实现层面上,我搭建了一个由五台服务器组成的微型 Hadoop 集群,并且用 Python 实现了 Parallel FP-Growth 算法中的三个 MapReduce 过程。

Python 100.00%
hadoop mapreduce mapreduce-python fp-growth

mining-frequent-pattern-from-search-history's Introduction

搜索记录频繁模式挖掘

这是一个《大数据挖掘技术》@复旦课程项目,试图从搜狗实验室用户查询日志数据(2008)中找出搜索记录中有较高支持度关键词的频繁二项集。在实现层面上,我搭建了一个由五台服务器组成的微型 Hadoop 集群,并且用 Python 实现了 Parallel FP-Growth 算法中的三个 MapReduce 过程。

一、Demo

1.1 快速开始

请确保 Python 以及 jieba 中文分词库已安装。

若没有安装 jieba ,在命令行中:

pip install jieba # for python
pip3 install jieba # for python3

或者直接运行无 jieba 版本 find_pair_nojieba.py(会没有关键词近似匹配功能)。

不修改任何文件,运行 .src/demo/find_pair.py

输入想要匹配的查询词即可。

1.2 自定义

将 MR3 的结果(所有 part-* 文件) 取回本地,存放在同一目录下(比如 ./result/res3/ )。

修改 ./src/demo/combine_parts.py 中的两个参数(输入文件目录和输出文件路径),然后运行 ./src/demo/combine_parts.py ,即可合并所有的 part-* 文件。

然后将 ./src/demo/find_pair.py 中的参数修改为刚才得到的合并结果的路径,运行 ./src/demo/find_pair.py

接下来输入想要查询的关键词,就会返回其频繁二项集。

二、频繁模式挖掘

请确保 Hadoop 集群已经完成配置并且工作正常。

以下的所有相对路径均以工程根目录为当前目录 ./

2.1 建立工程目录

为了方便地直接按照默认参数运行预处理文件,请按照如下目录树建立一些空的 datalog 目录:

./
|
+-- data/
|    |
|    +---- raw/ # 原始数据集文件目录
|    |      |
|    |      +-- SogouQ/ # 搜狗数据集原始文件目录
|    |
|    +---- temp/ # 临时文件目录,用于存放转码后的数据文件
|    |
|    +---- clean/ # 存放清洗后的数据文件
|    |
|    +---- BD_jieba/ # 存放关键词提取的结果,这也是第一个 MapReduce 的输入文件目录
|    |
|    +---- result/ # 存放分组结果,即 F-list 和 G-list
|
+-- log/ # 预处理输出日志目录
|
...

2.2 获取数据集

于搜狗实验室https://www.sogou.com/labs/resource/q.php下载数据集,请下载完整版数据集,因为三个大小的数据集的格式并不一致。

将下载得到的数据集** 31 个文件解压到 ./data/raw/SogouQ 中。

2.3 预处理

依次运行以下 Python 代码:

  1. ./src/preprocess/gb2utf8.py
  2. ./src/preprocess/format_file_v2.py
  3. ./src/preprocess/to_db_jieba.py

2.4 将数据上传至 HDFS

接下来将 ./data/DB_jieba 目录下所有需要的文件上传到 HDFS 中。

首先从本地把数据文件上传到 Master 中,假设 Master 服务器( hadoop@master )中我们的工作目录为 ~/pj/ ,其中有 datasrc 两个子目录。

scp ./data/DB_jieba/*.txt hadoop@master:~/pj/data/

然后在 Master 上将数据文件存入 HDFS:

hadoop fs -mkdir /pj
hadoop fs -mkdir /pj/data
hadoop fs -put ~/pj/data/*.txt /pj/data

可以通过

hadoop fs -ls /pj/data

确认文件是否上传成功。

2.5 上传源代码

将以下代码文件上传到 Master 的 ~/pj/src/ 目录下:

  • ./src/mapper1.py
  • ./src/mapper3.py
  • ./src/reducer1.py
  • ./src/reducer2.py
  • ./src/reducer3.py

然后在 Master 给予它们执行权限:

chmod +x ~/pj/src/*.py

2.6 运行 MR1: 并行计数

请确认 Hadoop Streaming hadoop/share/hadoop/tools/lib/hadoop-streaming-{版本号}.jar 的路径,此处以 /home/hadoop/cluster/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.8.5.jar 为例。

在 Master 上使用以下命令执行第一个 MapReduce:

yarn jar /home/hadoop/cluster/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.8.5.jar -file ~/pj/src/mapper1.py -file ~/pj/src/reducer1.py -mapper ~/pj/src/mapper1.py -reducer ~/pj/src/reducer1.py -input /pj/data/*.txt -output /pj/res1/

执行完毕后,首先在 Master 上将结果从 HDFS 中取出:

hadoop fs -get /pj/res1/part-* ./data/

然后在本地,将结果传回来:

scp hadoop@master:~/pj/data/part-* ./data/result/

2.7 项目分组

修改 ./src/sort_kv.py 中主函数里 sort_file() 函数的第一个输入参数为上一步得到的结果的相对路径(如 ../data/result/part-00000 ),然后运行 ./src/sort_kv.py

将得到的 ./data/result/G-list.json 文件内容全部复制,粘贴为 ./src/mapper2.pyG-list 变量的值。

然后上传 ./src/mapper2.py 到 Master 的 ~/pj/src/ 目录下,并给予权限:

chmod +x ~/pj/src/mapper2.py

2.8 运行 MR2: 并行 FP-Growth

在 Master 上使用以下命令执行第二个 MapReduce:

yarn jar /home/hadoop/cluster/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.8.5.jar -D mapreduce.job.reduces=30 -file ~/pj/src/mapper2.py -file ~/pj/src/reducer2.py -mapper ~/pj/src/mapper2.py -reducer ~/pj/src/reducer2.py -input /pj/data/*.txt -output /pj/res2/

上述命令中 -D mapreduce.job.reduces=N 参数的 N 指的是要分配的 Reducer 数目,官方推荐数值为 (0.95 或 1.75) * 所有 Slave 节点总核数。比如对于 Slave 一共 32 核的集群,可以选择 30 (计算效率最高)或 56 (计算稳定性最好)。

2.9 运行 MR3: 汇总

在 Master 上使用以下命令执行第三个 MapReduce:

yarn jar /home/hadoop/cluster/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.8.5.jar -D mapreduce.job.reduces=30 -file ~/pj/src/mapper3.py -file ~/pj/src/reducer3.py -mapper ~/pj/src/mapper3.py -reducer ~/pj/src/reducer3.py -input /pj/res2/part-* -output /pj/res3/

若有需要可以将得到的结果按照类似 2.6 节的方法取回 Master 或本地。

三、项目文档

本项目的详细项目文档在这里

如果对您有帮助就请在右上角 Star 一下这个仓库吧~

mining-frequent-pattern-from-search-history's People

Contributors

cldxiang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.