zoukankan      html  css  js  c++  java
  • Hadoop 实现 TFIDF 计算

    学习Hadoop 实现TF-IDF 算法,使用的是CDH5.13.1 VM版本,Hadoop用的是2.6.0的jar包,Maven中增加如下即可

     <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client</artifactId>
          <version>2.6.0</version>
          <scope>provided</scope>
        </dependency>
    

      

    代码如下:

    package top.eviltuzki.tfidf;
    
    import org.apache.hadoop.conf.Configured;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.*;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
    import org.apache.hadoop.util.GenericOptionsParser;
    import org.apache.hadoop.util.Tool;
    import org.apache.hadoop.util.ToolRunner;
    
    import java.io.*;
    import java.util.*;
    
    public class App extends Configured implements Tool {
    
        public int run(String[] strings) throws Exception {
            //第一个MR,计算IDF
            Job job = Job.getInstance(getConf());
            job.setJarByClass(App.class);
            job.setInputFormatClass(TextInputFormat.class);
            job.setOutputFormatClass(TextOutputFormat.class);
    
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
    
    
            job.setReducerClass(IdfReducer.class);
            job.setMapperClass(IdfMap.class);
            job.setNumReduceTasks(1);
    
            String[] args = new GenericOptionsParser(getConf(), strings).getRemainingArgs();
            FileInputFormat.setInputPaths(job,new Path(args[0]));
            FileOutputFormat.setOutputPath(job,new Path(args[1]));
    
            job.waitForCompletion(true);
    
            //第二个Map,计算TF以及TF-IDF
            Job job2 = Job.getInstance(getConf());
            job2.setJarByClass(App.class);
            job2.setInputFormatClass(TextInputFormat.class);
            job2.setOutputFormatClass(TextOutputFormat.class);
    
            job2.setMapOutputKeyClass(Text.class);
            job2.setMapOutputValueClass(DoubleWritable.class);
    
    
    
            job2.setMapperClass(TfMap.class);
            job2.setNumReduceTasks(0);
    
            args = new GenericOptionsParser(getConf(), strings).getRemainingArgs();
            FileInputFormat.setInputPaths(job2,new Path(args[0]));
            FileOutputFormat.setOutputPath(job2,new Path(args[2]));
    
            job2.waitForCompletion(true);
    
            return 0;
    
        }
    
        public static class IdfMap extends Mapper<LongWritable,Text,Text,IntWritable>{
    
            /**
             * 比较简单,就是进行WordCount的操作
             * @param key
             * @param value
             * @param context
             * @throws IOException
             * @throws InterruptedException
             */
            @Override
            protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
                String[] words = value.toString().split(" ");
                Set<String> set = new HashSet<String>();
                for (String word : words) {
                    if (word.length() > 1)
                        set.add(word);
                }
                for (String s : set) {
                    context.write(new Text(s),new IntWritable(1));
                }
            }
        }
    
        public static class IdfReducer extends Reducer<Text,IntWritable,Text,FloatWritable>{
            @Override
            protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
                int sum =0 ;
                for (IntWritable value : values) {
                    sum+=value.get();
                }
                float x =(float) ( 500.0 / sum+1);//比较笨了。。直接写死。。我这有500个样本,没想出来怎么读取数量。。。
                float log = (float) Math.log(x);
                context.write(key,new FloatWritable(log));
            }
        }
    
        public static class TfMap extends Mapper<LongWritable,Text,Text,DoubleWritable>{
            private Map<String,Double> map = new HashMap<>();
    
    
            @Override
            protected void setup(Context context) throws IOException, InterruptedException {
                FileSystem fs = FileSystem.get(context.getConfiguration());
                // 读取文件列表,不知道怎么加载路径了。。。就直接写死了。。。
                Path filePath =new Path("/user/zj/tfidf/jaroutput/part-r-00000");
                try (InputStream stream = fs.open(filePath)) {
                    try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
                        String line = "";
                        while ((line=reader.readLine())!=null){
                            String[] split = line.split("\t");
                            if(split.length == 2)
                                map.put(split[0],Double.parseDouble(split[1]));
                        }
                    }
                }
    
            }
            @Override
            protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
                String[] wordArray = value.toString().split(" ");
                List<String> words = new ArrayList<>();
                for (String s : wordArray) {
                    if (s.length()>1)
                        words.add(s);
                }
                Map<String,Integer> res = new HashMap<>();
                for (String word : words) {
                    if(res.containsKey(word))
                        res.put(word,res.get(word)+1);//计算本文的词频
                    else
                        res.put(word,1);
                }
                for (Map.Entry<String, Integer> entry : res.entrySet()) {
                    String key1 = entry.getKey();
                    Integer value1 = entry.getValue();
                    double tf = value1*1.0 /words.size();//这里计算的就是tf,tf = 本文中这个词的次数/总词数
                    context.write(new Text(key1),new DoubleWritable(tf * map.get(key1)));//tf直接和idf相乘
                }
            }
        }
    
        public static void main(String[] args) throws Exception {
            Configured conf = new Configured();
            ToolRunner.run(new App(),args);
        }
    }
    

      

    整体实现算是比较简单,第一个MR计算idf,map是统计每个文档出现过的词,都记成1次,然后reducer统计所有的,这样就得到了每一个词的idf了

    公式是idf=log(总文章数/(词出现的文章数+1))

    第二个Map就计算tf ,既然得到了TF就直接将Tf-IDF一起计算了。。可是读idf的结果。。没找到好办法,直接写死了。。计算idf的总文章数也是笨的直接写死了 = =!

    以后学会了怎么处理再改吧。。

    读取文件的样本比较简单,经过简单处理,一行是一个新闻,进行了简单的分词处理,标点符号还有单个汉字之类的就直接过滤掉了(程序中有)

    隐瞒 外星人 存在 受 质疑 ? 或 掌握 地外文明 搜狐 据 国外 媒体 报道 , 美国 国家 航空 航天局 ( ) 在 公众 眼中 是 一个 神秘 存在 , 该 机构 负责 太空 计划 并 拥有 最 先进 的 航空 航天 技术 , 不过 随着 太空 探索 的 不断 加深 , 公众 对 它 的 疑虑 也 日 益 俱 深 , 并 认为 他们 早已 与 外星人 有 了 联系 但 并 未 公开 。 公众 质疑 隐瞒 了 外星人 消息 世界 上 有 一些 机构 或者 组织 , 因 其 承担 的 工作 之 重要 , 以及 需要 的 专业 知识 之 精深 , 在 公众 眼中 总是 蒙 着 一 层 神秘 的 面纱 。 而 它们 对 公众 的 世界观 影响力 之 强 也 超乎 想象 。 美国 国家 航空 航天局 ( 简称 ) 就是 其中 一个 典型 的 例子 。 是 美国 负责 太空 计划 的 政府 机构 , 总部 位于 华盛顿 哥伦比亚特区 , 拥有 最 先进 的 航空 航天 技术 , 参与 了 美国 阿波罗 计划 、 航天飞机 发射 、 太阳系 探测 等 航天 工程 , 为 人类 探索 太空 做出 了 巨大 贡献 。 然而 伴随 着 太空 探索 深度 的 扩大 , 公众 对 它 的 疑虑 也 与 日 俱 深 。 公众 质疑 : 他们 早已 与 外星人 取得 了 联系 , 但 一直 没有 公开 美国 气象学家 斯考特 ・ 斯蒂文斯 日前 指责 美国 国家 航空 航天局 向 公众 隐瞒 了 许多 由 太阳 轨道 望远镜 传回 地球 的 资料 , 其中 包括 有 可能 是 “ 外星 生命 ” 的 信息 。 这 成为 不曾 间断 的 对 质疑 的 又 一个 新鲜 声音 。 太阳 轨道 望远镜 是 一 项 由 美国 国家 航空 航天局 和 欧洲 空间 局 实施 的 联合 研究 计划 。 目前 , 其 所 处 位置 距离 地球 约 万 公里 , 主要 对 太阳 的 爆发 情况 、 太阳 表面 喷 出 物质 和 太阳 附近 的 彗星 进行 拍照 。 到 现在 为止 , 该 望远镜 拍摄 的 照片 数量 已 高达 数 万 张 。 其中 一些 据称 出现 了 “ 不明飞行物 ” 的 身影 。 但 要么 对 其 避而不谈 , 要么 就 解释 说是 数字 图像 在 传回 地球 的 过程 中 出现 了 差错 , 才 导致 照片 中 出现 奇特 的 物体 。 但 斯考特 ・ 斯蒂文斯 指出 , 通过 分析 望远镜 传回 地球 的 所有 照片 资料 , 他 发现 在 不同 年份 拍摄 的 照片 上 都会 出现 完全 相同 的 不明 物体 。 斯考特 ・ 斯蒂文斯 由此 断言 , 如果 这些 不明 物体 仅仅 是 偶然 的 干扰 因素 ( 如 宇宙 尘埃 或 残留 的 太阳 粒子 等 ) 造成 的 , 那么 它们 的 形状 和 尺寸 就 不 可能 总是 完全 一样 。 他 表示 这 有 可能 表明 在 太阳 的 周围 经常 有 不明飞行物 光顾 , 并且 不只 一 艘 , 而是 一个 完整 的 编队 。 “ 外星人 ” 正在 以 太阳 为 客体 开展 试验 , 并 试图 影响 太阳 的 活动 情况 。 其实 , 的 使命 和 愿景 当中 就 蕴含 了 “ 寻找 地 外 生命 ” 和 “ 星际 移民 ” 的 内容 。 而 长期 以来 , 都 有 科学家 和 普通 公众 质疑 对 公众 隐瞒 了 有关 地外文明 的 真相 , 更 有 人 指出 , 早已 与 “ 外星人 ” 取得 了 联系 , 但 出于 种种 原因 一直 没有 公开 。 年 发生 在 美国 的 阿诺德 空中 遭遇 飞碟 案 和 罗斯威尔 飞碟 坠毁 案 以及 此后 由 美国 军方 领导 的 专门 调查 现象 的 “ 蓝皮书 计划 ” 、 “ 号志 计划 ” 、 “ 新墨西哥州 怀特 沙漠 试验场 计划 ” 等 研究 活动 , 开创 了 现代 研究 的 新纪元 。 多年 来 全球 各地 收到 的 目击 案例 已 超过 万 起 , 其中 有数 十万 起 是 无法 用 自然 和 物理 现象 做出 合理 解释 的 , 人们 怀疑 它 是 一 种 超越 人类 文明 的 外星 智慧 生命 所为 。 美国 国家 射电 天文台 和 国家 航空 航天局 从 年 开始 进行 微波 监听 宇宙 文明 的 “ 奥兹 玛 计划 ” 和 “ 赛克 洛普 计划 ” 。 年月 和 年月 , 美国 先后 发射 了 先驱者 号 、 号 [| 宇宙 飞船 |] , 携带 地球人 给 外星人 的 一 封 自荐信 , 当中 镌刻 着 地球 和 太阳系 在 银河系 的 位置 , 地球人 男人 和 女人 的 形象 , 以及 表示 宇宙 间 最 丰富 的 物质 氢 的 分子 结构图 , 寄望 外星人 截获 此 信 。 到 深 空 去 探测 “ 地外文明 ” 的 存在 ? 时至 今日 , 已经 发展 成为 雇员 人数 约 万 的 大型 机构 , 年度 经费 超过 亿 美元 。 在 其 推进 的 众多 高 精 尖 项目 中 , “ 深 空 网络 ” 是 近期 的 一 大 热点 。 那么 , “ 深 空 网络 ” 到底 为 何物 ? 深 空 网络 ( , ) 是 一个 支持 星际 任务 、 无线电 通信 以及 利用 射电天文学 观察 探测 太阳系 和 宇宙 的 国际 天线 网络 , 它 是 地球 上 最大 也 是 最 敏感 的 科学 研究 用途 的 通信 系统 。 目前 深 空 网络 由 三 处 呈 度 分布 的 深 空 通信 设施 构成 , 一 处在 美国 加州 的 戈尔德斯通 , 处于 巴斯托 市 附近 的 莫哈维沙漠 之 中 ; 一 处 位于 西班牙 马德里 附近 ; 另 一 处 位于 澳大利亚 的 堪培拉 附近 。 这种 安排 使得 可以 连续 观察 地球 的 自转 的 过程 。 深 空 探测 的 一个 重要 用途 , 便 是 探索 地外文明 的 存在 。 分享
    库克 : 最大压力 的 搜狐 事件 : 上周 三 , 苹果 股价 单 日 大跌 创 近 个 月 最低 , 按 当天 收盘价 计算 , 距离 月 创下 的 历史 高点 跌 去 了 逾 , 被 认为 已经 踏 上 了 熊 途 。 点评 : 我 想 库克 最近 一定 心情 不好 , 压力 很 大 。 因为 近 一 段 时间 来 , 糟糕 的 事情 一 件 接着 一 件 降临 到 苹果 头上 。 令 人 失望 的 开启 了 苹果 的 厄运 , 地图 门 、 高 管 下课 、 销售 不及 预期 , 重重 利空 叠加 之 下 , 郭台铭 的 一 句 “ 太 难 生产 了 , 我们 难以 满足 巨大 的 需求 ” , 就 成为 压垮 苹果 股价 的 最后 一 根 稻草 。 昔日 的 光环 已经 褪 尽 , 苹果 的 竞争力 和 创新力 正 遭受 前所未有 的 质疑 。 面临 掌舵 苹果 以来 的 最大 挑战 , 库克 能否 化 危 为 机 , 扭转 颓势 , 尚 不得而知 。 分享
    单身贵族 也 有 品 热门 [| 数码 相机 |] 大 盘点 搜狐 数码 佳能 作为 升级 机型 , 在 诸多 细节 方面 做 了 改变 , 大幅 提升 了 对 焦 及 连 拍 性能 , 为 普及型 [| 数码 单反 相机 |] 定义 到 了 新 高度 。 新型 图像 感应器 有效像素 为 万 , 与 能 高效 处理 图像 并 控制 相机 功能 的 数字 影像 处理器 组合 , 实现 了 高画质 、 高感光度 低 噪 点 。 目前 , 佳能 报价 参数 图片 论坛 热门 软件 单机 的 最新 报价 为 元 。 重庆 掀 开 触控 新 篇章 佳能 仅 ▲ 佳能 从 外观 上 看 , 佳能 与 尺寸 重量 相差 不大 , 整体 外形尺寸 为 × × , 重 约 仅 机身 。 除了 按键 布局 基本 上 没有 变化 外 , 最大 的 改进 在于 它 采用 英寸 万 像素 可 [| 旋转 触摸屏 |] , 这 也 是 佳能 首次 将 触摸屏 设计 在 单反 上 , 配合 带来 高速 合 焦 , 可 实现 触摸 对 焦 、 触摸 快门 、 触摸 回放 功能 。 重庆 掀 开 触控 新 篇章 佳能 仅 ▲ 佳能 从 性能 上 看 , 佳能 搭载 规格 传感器 , 有效像素 达 万 。 配合 最新 型 处理器 , 实现 了 高画质 、 高感光度 低 噪 点 它 的 快门速度 为 秒 , 连 拍 速度 达 每 秒 张 , 感光度 范围 , 扩展 可 达 。 其 采用 中央 八 向 双十字 全 点 十字型 自动 对 焦 , 使 所有 自动 对 焦 区域 都 能 高精度 合 焦 。 追踪 动态 被 摄 体 持续 对 焦 的 人工智能 伺服 自动 对 焦 算法 得到 进化 , 性能 大幅 提高 。 重庆 掀 开 触控 新 篇章 佳能 仅 ▲ 佳能 编辑 点评 : 佳能 还 在 内置 相片 处理 方面 提供 给 用户 最大 的 选择 余地 , 不但 提供 了 拍摄 模式 , 还 增加 了 快速 连 拍 张 照片 合成 的 手持 夜景 模式 , 另外 相机 又 内置 了 一 系列 特效 滤镜 , 配合 屏 的 轻 触 设计 , 用户 可 更 方便 加入 不同 效果 , 输出 独 具 风格 的 照片 。 参考价格 元 我 也 要 打分 : 喜欢 一般 很 差 更 多 条 论坛 热贴 条 人 关注 分 上 一 页 下 一 页 文本 导航 第 页 尼康 第 页 佳能 套机 第 页 宾得 套机 第 页 徕卡 第 页 卡西欧 第 页 佳能 第 页 索尼 分享
    索尼 美 上市 三防 设计 美元 起 搜狐 【 搜狐 数码 消息 】 月 日 消息 , 在 登录 欧洲 市场 个 月 之后 , 索尼 日前 已经 正式 于 美国 开 售 。 这 款 [| 三防 手机 |] 共有 黄 、 白 、 黑 三 种 颜色 选择 , 售价 也 因 机身 颜色 而 不同 , 分别 是 美元 、 美元 、 美元 ( 无 锁 机 ) 。 配置 方面 , 配备 了 英寸 ( ) 抗 划伤 无机 玻璃 显示屏 , 即使 屏幕 或 手指 沾 有 液体 , 仍 可 准确 跟踪 。 另外 , 机身 内部 采用 了 双核 芯片 , 内存 , 存储 空间 ( 支持 卡 拓展 ) , 万 [| 像素 摄像头 |] , [| 毫安 电池 |] 。 ( ) 分享
    最新 研究 称 近 距 双子星 是 星云 奇特 喷射 流 来源 搜狐 【 搜狐 科学 消息 】 据 美国 太空 网站 报道 , 目前 , 科学家 最新 研究 表示 , 行星状星云 中 一对 彼此 环绕 的 恒星 作为 “ 宇宙 发电站 ” , 为 该 星云 壮观 喷射 流 提供 后方 能量 。 这 项 发现 揭晓 了 科学家 长期 置疑 “ 弗莱明 号 ” 行星状星云 的 喷射 流 形状 之 谜 , 这些 喷射 流 呈现 为 奇特 的 节 状 和 弯曲 结构 , 最新 研究 显示 这种 奇特 喷射 流 是 由 “ 发电站 ” 双子星 的 轨道 交互 作用 提供 动力 。 研究 报告 作者 、 智利 天文学家 亨利博芬 说 : “ 这 是 一 项 大型 天文 观测 研究 项目 , 用于 理解 奇特 、 非 对称 形状 的 行星状星云 。 ” 据 科学家 称 , 的 行星状星云 具有 不 平衡 结构 。 事实上 行星状星云 与 行星 没有 关系 , 它们 是 垂死 白矮星 生命 末期 阶段 。 博芬 研究 小组 使用 甚 大 望远镜 观测 “ 弗莱明 号 ” 行星状星云 , 据称 , 这 个 行星状星云 是 以 天文学家 威廉米娜 弗莱明 命名 , 她 于 年 在 哈佛大学 天文台 观测 发现 这 个 行星状星云 。 数 十年 以来 , 天文学家 一直 对 环绕 该 星云 周围 的 奇特 气体 迷惑不解 , 博芬 和 他 的 研究 同事 在 计算机 模拟 系统 上 结合 最新 观测 数据 , 证实 了 一对 白矮星 充当 着 “ 宇宙 发电站 ” 。 多数 双子星 轨道 周期 为数 百年 或者 数 千年 , 但是 “ 弗莱明 号 ” 行星状星云 的 光谱 数据 显示 其中 的 双子 恒星 运行 速度 更 快 , 快速 变化 的 光谱线 表明 这 对 恒星 轨道 周期 仅 为 天 。 博芬 说 : “ 这 是 一对 非常 接近 的 双子星 系统 。 ” 他 还 指出 , 其它 双子星 系统 中 也 发现 类似 的 轨道 周期 。 这 个 行星状星云 中 的 恒星 曾 共享 环绕 星云 的 气体 层 , 在 其它 双子星 系统 中 也 非常 普遍 。 然而 , 环绕 星云 的 气体 喷射 流 并 不是 当前 存在 。 这 项 研究 报告 现 发表 在 月 日 出版 的 《 科学 》 杂志 上 。 起初 , “ 弗莱明 号 ” 行星状星云 中 这 两 颗 恒星 相距甚远 , 较 大 的 恒星 逐渐 从 一 颗 红巨星 演变 为 体积 庞大 的 渐近 巨 支 星 , 此时 它 将 形成 数 百倍 太阳 直径 。 这 颗 超大 质量 恒星 释放 的 气体 流 之后 流向 体积 较 小 的 邻近 恒星 ― ― 一 颗 寒冷 的 白矮星 , 此时 气体 流 像 从 水龙头 中 释放 出来 一样 , 从 这 两 颗 恒星 向 外 喷射 。 博芬 称 , 这 只是 恒星 生命 历程 中 非常 短暂 的 一个 时期 , 仅 持续 年 。 随着 时间 的 流逝 , 巨大 的 恒星 失去 了 它们 的 气体 , 变成 了 一 颗 白矮星 。 气体 将 恒星 包裹 起来 , 推动 它们 逐渐 靠拢 在 一起 。 当 恒星 逐渐 接近 , 包裹 它们 的 气体 将 被 驱逐 , 该 气体 喷射 流 的 “ 水龙头 ” 也 将 关闭 。 博芬 研究 小组 认为 , 这种 现象 普遍 存在 于 行星状星云 中 的 双子星 系统 , 但 同时 强调 需要 更 多 的 观测 来 证实 这 一 理论 。 ( 卡麦拉 ) 分享

    Maven 打包之后运行

    命令如下:

    hadoop jar learn-1.0-SNAPSHOT.jar top.eviltuzki.tfidf.App /user/zj/tfidf/allcontent /user/zj/tfidf/jaroutput /user/zj/tfidf/finaloutput

    输出结果就简单看一下吧 = =

    [cloudera@quickstart tfidf]$ hadoop fs -cat /user/zj/tfidf/finaloutput/part-m-00000 |grep -v E| sort -k2 -rn |head -n 20
    宋体    2.2809544503092782
    宋体    1.3156868388809182
    东北虎    0.7394429830508474
    网盘    0.571717673015873
    网盘    0.571717673015873
    电视广告    0.5665861818181818
    出货量    0.5347087089347079
    黑色星期五    0.5342098285714285
    雪豹    0.5053336216216217
    红茶    0.4936592475247525
    携程    0.47571826851851845
    野生    0.47535620338983053
    音乐    0.4412029517241379
    角膜    0.43890478873239436
    美食    0.4262510461538462
    摇椅    0.42329096944444444
    摇椅    0.42329096944444444
    美景    0.4227268664556961
    酷派    0.42054887452054796
    朝鲜    0.4166495891891892

    也不知道为啥会出现重复的,个人想法应该是多篇文章中统计出来的吧。。。但是分值都一样- -有点。。。额。。也许是重复的新闻也说不好。。。

  • 相关阅读:
    搭建MHA问题汇总
    NOIP2009 靶形数独
    get_mysql_conn_info.py
    NOIP 2005 篝火晚会
    MySQL启动关闭添加到 /etc/init.d/mysqld
    noip2002 矩形覆盖
    get_slave_status.py
    [JSOI2008]魔兽地图
    MySQL数据导出导入任务脚本
    8.30 牛客OI赛制测试赛1 F题 子序列
  • 原文地址:https://www.cnblogs.com/eviltuzki/p/8284672.html
Copyright © 2011-2022 走看看