先读取字典,然后读取统计文章,
采用最大匹配(即匹配最长的词语)进行分词
使用字典树做成字典对词频进行统计:
字典不是很全,可以这里下载: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