1. 程式人生 > >Pig + Ansj 統計中文文字詞頻

Pig + Ansj 統計中文文字詞頻

最近特別喜歡用Pig,擁有能滿足大部分需求的內建函式(built-in functions),支援自定義函式(user defined functions, UDF),能load 純文字、avro等格式資料;illustrate看pig執行步驟的結果,describe看alias的schema;以輕量級指令碼形式跑MapReduce任務,各種爽爆。

1. Word Count

較於中文,英文比較工整,可以根據空格、標點符號進行分詞。

A = load '/user/.*/req-temp/text.txt' as (text:chararray);
B = foreach A generate flatten(TOKENIZE(text)) as word;
C = group B by word;
D = foreach C generate COUNT(B), group;

Pig的內建函式TOKENIZE用StringTokenizer來對英文文字進行分詞(程式碼參看這裡),繼承於抽象類EvalFunc<T>,返回DataBag片語。為了能統計單個詞詞頻,需要用函式flatten對片語進行打散。抽象類EvalFunc<T>為用於pig語句foreach .. generate ..中的基類,以實現對資料欄位的轉換操作,其中exec()方法在pig執行期間被呼叫。

public class TOKENIZE extends EvalFunc<DataBag> {
    TupleFactory mTupleFactory = TupleFactory.getInstance();
    BagFactory mBagFactory = BagFactory.getInstance();

    @Override
    public DataBag exec(Tuple input) throws IOException {
        ...
        DataBag output = mBagFactory.newDefaultBag();
        ...
        String delim = " \",()*";
        ...
        StringTokenizer tok = new StringTokenizer((String)o, delim, false);
        while (tok.hasMoreTokens()) {
            output.add(mTupleFactory.newTuple(tok.nextToken()));
        }
        return output;
        ...
    }
}

2. Ansj中文分詞

為了寫Pig的UDF,需要新增maven依賴:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>${hadoop.version}</version>
    <scope>provided</scope>
</dependency>
    
<dependency>
    <groupId>org.apache.pig</groupId>
    <artifactId>pig</artifactId>
    <version>${pig.version}</version>
    <scope>provided</scope>
</dependency>
    
<dependency>
    <groupId>org.ansj</groupId>
    <artifactId>ansj_seg-all-in-one</artifactId>
    <version>3.0</version>
</dependency>

輸入命令hadoop version得到hadoop的版本,輸入pig -i得到pig的版本。務必要保證與叢集部署的pig版本一致,要不然會報錯:

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias D

然後依葫蘆畫瓢,根據TOKENIZE.java修改,得到中文分詞Segment.java

package com.pig.udf;

public class Segment extends EvalFunc<DataBag> {

    TupleFactory mTupleFactory = TupleFactory.getInstance();
    BagFactory mBagFactory = BagFactory.getInstance();

    @Override
    public DataBag exec(Tuple input) throws IOException {
        try {
            if (input==null)
                return null;
            if (input.size()==0)
                return null;
            Object o = input.get(0);
            if (o==null)
                return null;
            DataBag output = mBagFactory.newDefaultBag();
            if (!(o instanceof String)) {
                int errCode = 2114;
                String msg = "Expected input to be chararray, but" +
                " got " + o.getClass().getName();
                throw new ExecException(msg, errCode, PigException.BUG);
            }
            
            // filter punctuation
            FilterModifWord.insertStopNatures("w");
            List<Term> words = ToAnalysis.parse((String) o);
            words = FilterModifWord.modifResult(words);
            
            for(Term word: words) {
                output.add(mTupleFactory.newTuple(word.getName()));
            }
            return output;
        } catch (ExecException ee) {
            throw ee;
        }
    }

    @SuppressWarnings("deprecation")
    @Override
    public Schema outputSchema(Schema input) {
    ...
    }
    ...

ansj支援設定詞性的停用詞FilterModifWord.insertStopNatures("w");,如此可以去掉標點符號的詞。將原始碼打包後放在hdfs上,然後通過register jar包呼叫該UDF:

REGISTER ../piglib/udf-0.0.1-SNAPSHOT-jar-with-dependencies.jar
A = load '/user/.*/renmin.txt' as (text:chararray);
B = foreach A generate flatten(com.pig.udf.Segment(text)) as word;
C = group B by word;
D = foreach C generate COUNT(B), group;

擷取人民日報社論的一段:

樹好家風,嚴管才是厚愛。古人說:“居官所以不能清白者,率由家人喜奢好侈使然也。”要看到,好的家風,能繫好人生的“第一粒釦子”。“修身、齊家”,才能“治國、平天下”,領導幹部首先要“正好家風、管好家人、處好家事”,才能看好“後院”、堵住“後門”。“父母之愛子,則為之計深遠”,與其冒著風險給子女留下大筆錢財,不如給子女留下好家風、好作風,那才是讓子女受益無窮的東西,才是真正的“為之計深遠”。

統計詞頻如下:

...
(3,能)
(2,要)
(2,計)
(1,與其)
(1,作風)
(1,使然)
(1,修身)
(1,厚愛)
(1,受益)
...

可見,ansj在不載入使用者自定義詞表的情況下,分詞效果並不理想,不能對成語等詞正確地分詞。

相關推薦

Pig + Ansj 統計中文文字詞頻

最近特別喜歡用Pig,擁有能滿足大部分需求的內建函式(built-in functions),支援自定義函式(user defined functions, UDF),能load 純文字、avro等格式資料;illustrate看pig執行步驟的結果,describe看alias的schema;以輕量級指令

Python文字詞頻統計的編碼問題-MOOC嵩天

1 Python文字詞頻統計程式碼 1.1Hamlet詞頻統計(含Hamlet原文文字) #CalHamletV1.py def getText(): txt = open("hamlet.txt", "r").read() txt = txt.lower()

Python語言程式設計(MOOC崇天)第六章組合資料型別學習筆記(基本統計值計算+文字詞頻統計

複習: 今日內容:組合資料型別 集合型別及操作: 集合型別的定義: 非可變的資料型別:整數、浮點、元組、負數、字串型別 可變的資料型別:列表list和字典dict。所以看不到集合中有列表、{[ ]}  就算是set([1

使用Spark、Ansj分詞進行詞頻統計

使用Spark進行詞頻統計 最近在做一個專案,要對大量的文字進行詞頻統計,發現常規的方法處理比較慢,所以嘗試使用Spark進行計算。思路大致是這樣:爬蟲爬取京東的評論資料到mongodb,然後我從mongodb拉資料上傳到HDFS,從HDFS拉資料然後用Spa

jieba庫以及文字詞頻統計

簡介◆ jieba庫是優秀的中文分詞第三方庫◆ jieba庫和其他的第三方庫一樣,在cmd中使用pip install jieba 就可以進行安裝◆ jieba最常用的函式只有一個,在下面我們會見到jieba庫的三種模式及其函式◆ 精確模式:jieba.lcut(s)   

NLTK統計中文詞頻並輸出

# -*- coding: utf-8 -*- ''' 使用NLTK對中文進行詞頻統計並輸出 ''' from nltk import FreqDist def delblankline(infil

模擬拷貝文件動畫顯示編程只需兩行中文文字即可完成

gif動畫 ref 講師 window cto color tro 拷貝文件 windows 模擬拷貝文件動畫顯示編程只需兩行中文文字即可完成,初學編程人員一看就會的編程。windows系統中復制文件時的那個GIF動畫,拷貝文件時顯示文件加的動畫。資料來源於 【王西猛講師的

lucene 統計單詞次數(詞頻)並進行排序

edm font tin total .html lan 技術 rms puts 1 public class WordCount { 2 static Directory directory; 3 // 創建分詞器 4 stati

轉載:Spark 使用ansj進行中文分詞

轉載:https://www.cnblogs.com/JustIsQiGe/p/8006734.html 在Spark中使用ansj分詞先要將ansj_seg-5.1.1.jar和nlp-lang-1.7.2.jar加入工程 ansj原始碼github:https://github.com/

使用機器學習完成中文文字分類

資料集來自七月線上練習 import jieba import pandas as pd import random from sklearn.model_selection import train_test_split #劃分訓練/測試集 from sk

判斷中文文字編碼格式是gbk還是utf-8的一種簡單方式

import java.io.*; public class charsetTest { public static String charsetType(String fileName) throws IOException { BufferedReader reader =

[Trie樹] 統計英文文字中單詞出現的個數 - C語言實現 - 考慮數字、英文

【英文文字】 However, after reaching the shore there are plenty of challenges waiting for him."The biggest challenge now is learning to walk agai

mongodb中文文字資料(新聞評論)預處理程式碼(python+java)

中文文字資料預處理 Mongodb資料匯出到txt文件 將檔案按行寫入陣列 文字批量修改(加字尾等) Mongodb資料匯出到txt文件 #python # coding=utf-8 from pymongo

中文文字分類

        將文字進行分類是自然語言處理當中最主要的工作之一,本文處理很重要的一項工作就是對文字進行向量化,本文不做詳細的介紹,只是採用TF-IDF的方法對文字進行向量化,然後分別採用SVM,  Bayes,  RandomForest

習題6-8 統計一行文字的單詞個數 (15 point(s))

習題6-8 統計一行文字的單詞個數 (15 point(s)) 本題目要求編寫程式統計一行字元中單詞的個數。所謂“單詞”是指連續不含空格的字串,各單詞之間用空格分隔,空格數可以是多個。 輸入格式: 輸入給出一行字元。 輸出格式: 在一行中輸出單詞個數。 輸入樣例: Let

[python] jieba 模組 -- 給中文文字分詞

在文字處理時,英文文字的分詞一直比中文文字要好處理許多。因為英文文字只需要通過空格就可以分割,而中文的詞語往往就很難從句子中分離出來。這種時候我們往往需要一個“詞典”來實現分詞,而尋找“詞典”又是件非常麻煩的事。 不過, python 強大的第三方模組中早有了解決方案。在 PyPI 上面搜尋“中

中文文字的關鍵字提取

基於 TF-IDF 演算法的關鍵詞抽取 import jieba.analyse sentence = "人工智慧(Artificial Intelligence),英文縮寫為AI。它是研究、開發用於模擬、延伸和擴充套件人的智慧的理論、方法、技術及應用系統的一門新的技術科學。人工智慧是

Developing DataBase Applications Using MySQL Connector/C++ 中文文字

Developing DataBase Applications Using MySQL Connector/C++ 中文文字 ​ by grayondream 翻譯自mysql Connector C++幫助文件[http://download.csdn.net/detail/mi