下一篇<自然语言处理基于java实现(2) 之 词性注释>
程序源码下载
一. 题目如下:
1、针对人民日报语料,编写程序:
抽取词表
统计总词数、不同的词及其次数。输出文件格式:
第一行是语料库中的总词数,之后每行一个词及其次数,按照词频从小到大排序。如:
总词数:10000
#韩国:169
#民族:571
……
去除语料中的分词和词性标记,形成未加工的语料(原始文本)
2、基于上述词表,编写一个正向最大匹配分词程序。程序功能:
输入:没有分过词的文件或一段文本
输出:分过词的文件或一段文本。
3、编写一个评价程序,自动评价分词结果的准确率。
人民日报语料截取小部分如下:
19980101-02-002-001/m 忠诚/a 的/u 共产主义/n 战士/n ,/w 久经考验/l 的/u 无产阶级/n 革命家/n 刘/nr 澜涛/nr 同志/n 逝世/v
19980101-02-002-002/m (/w 附/v 图片/n 1/m 张/q )/w
19980101-02-002-003/m 根据/p 刘/nr 澜涛/nr 同志/n 生前/t 遗愿/n 和/c 家属/n 的/u 意见/n ,/w 刘/nr 澜涛/nr 同志/n 的/u 丧事/n 从简/v ,/w 不/d 举行/v 仪式/n 、/w 不/d 保留/v 骨灰/n 。/w
二. 我们的目的是:
1. 将如”忠诚”,”的”等等(除去19980101-02-002-001/m,以及词性标注/w等等)词,进行统计
2. 对统计的词进行出现次数升序排序
3. 基于词库,用最大正向匹配算法,对任意句子进行分词
4. 写一个评价程序
三. 直接上代码:
package experiment1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* 词库
*/
public class Thesaurus{
/**
* 存储结构为:
* Entry<单词,次数>
*/
private List<Entry<String, Integer>> list = new ArrayList<>();
/**
* 加载词库,初始化
*/
public Thesaurus(String content){
//进行分词统计
final Map<String,Integer> MAP = createMAP(content);
//排序并存入list中
sortMapByValue(MAP);
}
/**
* 分词
* @param str 分词的句子
* @param symbol 分割的符号
* @return
*/
public String spitWord(final String str,final String symbol){
StringBuilder target = new StringBuilder();
int start = 0;
while(start<str.length()){
boolean noWord = true;
for(int end = str.length();end>start;end--){
String now = str.substring(start, end);
for(Entry<String,Integer> e:list){
if(e.getKey().equals(now)){
target.append(symbol).append(now);
start = end;
noWord = false;
break;
}
}
}
if(noWord){
target.append(symbol).append(str.charAt(start++));
}
}
return target.substring(symbol.length()).toString();
}
public int numOfSize(){
return list.size();
}
/**
* 分词
*