自己写中文分词之(二)_用HMM模型实现分词
关于HMM分词的理论基础就不说了,第一,自己能力尚浅,说不好。第二,已经有说得很好的了。参考:Itenyh版-用HMM做中文分词四:A Pure-HMM 分词器
【自己写中文分词之(二)_用HMM模型实现分词】我这里自己实现了用msr_training.utf8用以训练HMM的转移矩阵。
代码贴出来吧:
package com.xh.training;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
/*
* 根据语料的结果训练HMM模型的状态转移矩阵
* 一共有四个状态:
* B:一个词的开始
* E:一个词的结束
* M:一个词的中间
* S:单字成词
* 统计公式: Aij = P(Cj|Ci)=P(Ci,Cj) / P(Ci) = Count(Ci,Cj) / Count(Ci)
* */
public class StateTransferMatrixTraining {
//private String fileName;
private final static HashMap map=new HashMap();
static{
map.put('B', 0);
map.put('M', 1);
map.put('E', 2);
map.put('S', 3);
}
private long freq[][]=new long[4][4];
private long count[]=new long[4];
private void insert(StringBuilder sb,int start,int end){
if(end-start>1){
sb.append('B');
for(int i=0;
istart){
//得到一个词
//insertWithContent(content,sb,start,end);
insert(sb,start,end);
++end;
start=end;
}else{++start;
++end;
} }else{++end;
}
}
//insertWithContent(content,sb,start,end);
insert(sb,start,end);
return sb.toString();
}private double[][] cal(){
double[][] transferMatrix=new double[4][4];
int i,j;
for(i=0;
i<4;
i++){
for(j=0;
j<4;
j++){
transferMatrix[i][j]=(double)freq[i][j]/count[i];
}
}
return transferMatrix;
}public double[][] readFile(String fileName){
BufferedReader br=null;
String line;
try {
br=new BufferedReader(new InputStreamReader(new FileInputStream(new File(fileName)),"utf-8"));
while((line=br.readLine())!=null){
if("".equals(line.trim()))continue;
line=encode(line);
stmTraining(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {br.close();
}catch (IOException e) {e.printStackTrace();
}
}
//根据freq和count矩阵来计算转移矩阵return cal();
}private void stmTraining(String encodeStr){
int i,j,len;
len=encodeStr.length();
for(i=0;
i1){
sb.append(content.charAt(start));
sb.append('B');
for(int i=0;
i
测试的结果如下:
跟参考博客上面的稍微有点出入,不知道是不是程序哪里有漏掉的地方。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 尽力
- 牛人进化+|牛人进化+ 按自己的意愿过一生
- 别怪生活,自己作的!
- 今天写一些什么
- 小影写在2018九月开学季
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 放下心中的偶像包袱吧
- 靈魂裡有香氣的人
- 改变自己,先从自我反思开始