现在的位置: 首页 > 综合 > 正文

用字典树进行有字典中文分词 频率统计

2018年01月10日 ⁄ 综合 ⁄ 共 5223字 ⁄ 字号 评论关闭

先读取字典,然后读取统计文章,

采用最大匹配(即匹配最长的词语)进行分词

使用字典树做成字典对词频进行统计:

字典不是很全,可以这里下载:http://download.csdn.net/detail/mark063/5254651

下边是我的代码 在一个文件里

package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;


class Node{
	private HashMap<String, Node> son;
	private String item;
	private boolean isLeaf;
	private String str;
	Node(String item){
		son = new HashMap<String, Node>();
		this.item=item;
	}
	public String getStr() {
		return str;
	}
	public void setStr(String str) {
		this.str = str;
	}
	public String getItem() {
		return item;
	}
	public void setItem(String item) {
		this.item = item;
	}
	public HashMap<String, Node> getSon() {
		return son;
	}
	public void setSon(HashMap<String, Node> son) {
		this.son = son;
	}
	public boolean isLeaf() {
		return isLeaf;
	}
	public void setLeaf(boolean isLeaf) {
		this.isLeaf = isLeaf;
	}
}
class Item implements Comparable{
	private String str;
	private int number;

	public Item(String str, int number) {
		super();
		this.str = str;
		this.number = number;
	}
	public String getStr() {
		return str;
	}
	public void setStr(String str) {
		this.str = str;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public void addNew() {
		number++;
	}
	@Override
	public int compareTo(Object arg0) {
		return ((Item) arg0).getNumber()-getNumber();
	}
}
public class Main {
	static public void main(String args[]) throws IOException{
		Main test = new Main();
		test.solve();
		
	}

	@SuppressWarnings("unchecked")
	private void solve() throws IOException {
		BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/dict")));
		String tmpStr;
		Node dict = new Node("head");
		while((tmpStr=reader.readLine())!=null){
			dict = buildTree(dict, tmpStr, 0);
		}
		reader = new BufferedReader(new FileReader(new File("src/test/artical")));
		HashMap<String, ArrayList<Item>> ArticalIndex = new HashMap<String, ArrayList<Item>>();
		StringBuffer Artical = new StringBuffer();
		while((tmpStr=reader.readLine())!=null){
			Artical.append(tmpStr);
		}
		String LastArtical = Artical.toString().replaceAll("\\s*", "");
		System.out.println(LastArtical);
		
		int index=0;
		while(index<LastArtical.length()){
			index = buildArticalIndex(dict, LastArtical, ArticalIndex, index, false);
		}
		ArrayList<Item> result = new ArrayList<Item>();
		Iterator<Entry<String, ArrayList<Item>>> iterator = ArticalIndex.entrySet().iterator();
		while(iterator.hasNext()){
			Entry<String, ArrayList<Item>> e = iterator.next();
			result.add(new Item(e.getValue().get(0).getStr(), e.getValue().get(0).getNumber()));
		}
		Collections.sort(result);
		for(int i=0;i<result.size();i++)
			System.out.println(result.get(i).getStr()+" "+result.get(i).getNumber());
	}

	private int buildArticalIndex(Node parentDict, String lastArtical, HashMap<String, ArrayList<Item>> articalIndex, int index, boolean t) {
		String str=String.valueOf(lastArtical.charAt(index));
		if(parentDict.getSon().containsKey(str)){
			if(index+1<lastArtical.length())
				return buildArticalIndex(parentDict.getSon().get(str), lastArtical, articalIndex, index+1, true);
		}
		else if(parentDict.isLeaf()){
			if(!articalIndex.containsKey(parentDict.getStr())){
				ArrayList<Item> tmpArrayList = new ArrayList<Item>();
				tmpArrayList.add(new Item(parentDict.getStr(), 1));
				articalIndex.put(parentDict.getStr(), tmpArrayList);
			}
			else{
				articalIndex.get(parentDict.getStr()).get(0).addNew();
			}
			return index;
		}
		if(!t)
			return index+1;
		else return index;
	}

	private Node buildTree(Node parent, String tmpStr, int index) {
		String str=String.valueOf(tmpStr.charAt(index));
		if(parent.getSon().containsKey(str)){
			if(index+1<tmpStr.length())
				buildTree(parent.getSon().get(str), tmpStr, index+1);
			else{
				parent.getSon().get(str).setLeaf(true);
				parent.getSon().get(str).setStr(tmpStr);
			}
		}
		else{
			parent.getSon().put(str, new Node(str));
			if(index+1<tmpStr.length())
				buildTree(parent.getSon().get(str), tmpStr, index+1);
			else{
				parent.getSon().get(str).setLeaf(true);
				parent.getSon().get(str).setStr(tmpStr);
			}
		}
		return parent;
	}
}

运行效果:

羊城晚报讯 记者罗坪报道:记者昨天获悉,原茂名人大代表杨亚贵,一审在高州法院被控涉破坏生产经营犯罪、故意伤害罪、妨害公务罪、非法倒卖土地使用权犯罪、窜通投标犯罪共五宗罪名,法院认定其前三宗罪,数罪并罚领刑两年。该案同时牵出茂名化州市丽岗镇原党委书记杨华强,涉贪污套取国家下发的“计生经费”、自制单据侵占国家公款等总计34万多元,其数罪并罚获刑6年。

  一年前,羊城晚报披露原茂名人大代表杨亚贵遭当地村民联名举报,涉嫌强征土地致农民流离失所(详见羊城晚报2012年4月15日报道),消息披露约一月后,杨亚贵在家中被茂名公安局办案人员带走。记者昨日获悉,当时茂名警方成立了专案组,对其涉嫌强征土地问题进行了调查。

  去年被捕前,杨亚贵在接受记者采访时曾表示:群众举报是否属实,欢迎公安机关随时介入调查。2011年8月杨亚贵曾驾驶一辆宝马车,驶至广州珠江新城,以“宝马悬赏”的方式,反过来举报化州北岸双江一村民,指责其涉嫌强占双江村价值1200多万元的建设用地。去年,在得知杨亚贵被警方带走的消息后,化州当地众多村民敲锣打鼓,携带鞭炮上街鸣放。

  “广州珠江新城宝马悬赏案”历时一年,身为茂名人大代表的杨亚贵从高调回应到被警方立案侦查,到被诉获刑两年,终于尘埃落定。在其主要涉嫌“强征土地”案发缘由里,当地一审法院认为,杨亚贵涉嫌非法倒卖土地使用权,因指控证据不充分予以驳回该罪起诉。不过据判决书显示,案发前,杨亚贵曾借其人大代表身份,花钱请村民跪请政府,要求惩处举报他涉黑的另一带头村民庞亚统。

  杨亚贵案还牵出另一桩案件——化州市丽岗镇原镇委书记杨华强贪污案。根据判决书显示,杨华强在担任镇委书记期间,曾涉嫌与杨亚贵等人窜通投标,从其管理的镇上辖区内指定“窜通人”开发一块价值逾1000万的小区。归案后,杨华强一反常态极为配合,主动交代其贪污犯罪的诸多事实:如套取国家“计生三结合专项费用”7.1万元;自制票据侵占国家公款18万元;接受9万元贿赂以职务便利为他人安排“公职”。杨华强数罪并罚,一审获刑6年。

结果:

茂名 6
涉嫌 6
杨华 5
村民 4
记者 4
举报 4
人大代表 3
法院 3
羊城晚报 3
当地 3
一审 3
强征 3
宝马 3
犯罪 3
土地 3
警方 3
岗镇 2
新城 2
判决书 2
书记 2
带走 2
化州 2
获悉 2
调查 2
消息 2
悬赏 2
镇委 2
自制 2
显示 2
化州市 2
国家 2
价值 2
土地使用权 2
倒卖 2
贵在 2
侵占 2
非法 2
接受 2
去年 2
披露 2
案发 2
投标 2
套取 2
计生 2
进行 1
认为 1
充分 1
机关 1
建设 1
属实 1
尘埃落定 1
农民 1
主要 1
回应 1
公安 1
多万 1
该案 1
反过来 1
随时 1
职务 1
他人 1
公安局 1
贪污 1
其人 1
昨天 1
代表 1
北岸 1
双江村 1
总计 1
日报 1
当时 1
得知 1
案件 1
配合 1
单据 1
是否 1
镇上 1
下发 1
万多 1
驳回 1
高调 1
上街 1
生产经营 1
归案 1
众多 1
期间 1
辖区 1
花钱 1
介入 1
管理 1
成立 1
主动 1
通人 1
诸多 1
予以 1
开发 1
侦查 1
身为 1
指责 1
妨害公务罪 1
罪名 1
便利 1
惩处 1
指控 1
用地 1
联名 1
指定 1
采访 1
被控 1
历时 1
流离失所 1
票据 1
欢迎 1
根据 1
证据 1
政府 1
报道 1
罗坪 1
公职 1
起诉 1
故意伤害罪 1
双江 1
专项 1
群众 1
贪污犯 1
事实 1
敲锣打鼓 1
昨日 1
认定 1
一月 1
不过 1
该罪 1
详见 1
一块 1
立案 1
交代 1
身份 1
缘由 1
家中 1
一反常态 1
专案组 1
问题 1
强占 1
办案人 1
小区 1
方式 1
同时 1
极为 1
贿赂 1
担任 1
三结合 1
一村 1
党委书记 1
破坏 1
表示 1
要求 1
费用 1
鞭炮 1
经费 1
终于 1
鸣放 1
安排 1
被捕 1
贪污案 1
驾驶 1
携带 1
高州 1
带头 1

抱歉!评论已关闭.