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
java面試題:如果一串字符如"aaaabbc中國1512"要分別統計英文字符的數量,中文字符的數量,和數字字符的數量,假設字符中沒有中文字符、英文字符、數字字符之外的其他特殊字符。
rgs info log letter clas [] 面試題 .com ack package com.swift; public class TotalNumber_String { public static void main(String[] arg
模擬拷貝文件動畫顯示編程只需兩行中文文字即可完成
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/
統計一行文字的單詞個數 (15 分) 本題目要求編寫程式統計一行字元中單詞的個數。所謂“單詞”是指連續不含空格的字串,各單詞之間用空格分隔,空格數可以是多個。 輸入格式: 輸入給出一行字元。 輸出格式: 在一行中輸出單詞個數。 輸入樣例: Let's go to room 209. 輸出樣例
MD,一開始就想著怎麼 用空格和結尾前判斷字母 來計算寫的頭的爆了, 反過來判斷空格後面是否有 =‘ ’就尼瑪容易多了 #include<stdio.h> #include<stdlib.h> #include<string.h> int
使用機器學習完成中文文字分類
資料集來自七月線上練習 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