NLP规则分词实验报告
完成日期:2018.11.03
GitHub:https://github.com/fyinh/NLPLearning_MM_RMM_segment
详细理论介绍请看:https://blog.csdn.net/fyinh_/article/details/88867209
一、软件演示
(1)已“对外经济技术合作与交流不断扩大。”为例,演示页面如下:
可以看到,当RMM与MM的分词结果相同时,就直接输出分词结果。
(2)以“幼儿园地节目。”为例,演示页面如下:
可以看到,当RMM与MM的分词结果不相同时,将输出两种方法的分词结果,然后请人工选择。
二、代码
- 正向匹配
public void MM(String source, int len, int npos)
{//一把青菜 pos=0, len=3
int lenh=source.length();
if(npos+1>=lenh) return;
while((npos+len)>lenh)
{
len=len-1;
}
String substr=source.substring(npos,npos+len);
if(dict.contains(substr))
{
System.out.println(substr);
npos=npos+len;
result=result+substr+"/ ";
len=4;
MM(source,len,npos);
}
else
{
if(len>=1)
{
len=len-1;
MM(source,len,npos);
}
}
}
- 逆向匹配
public void RMM(String source, int len, int npos)
{
if(npos-1<0) return;
while((npos-len)<0)
{
len=len-1;
}
String substr=source.substring(npos-len,npos);
if(dict.contains(substr))
{
System.out.println(substr);
npos=npos-len;
result=substr+"/ "+result;
len=4;
RMM(source,len,npos);
}
else
{
if(len>=1)
{
len=len-1;
RMM(source,len,npos);
}
}
}
- 双向匹配
public class seg_bi {
seg_RMM s=new seg_RMM();
seg_only a = new seg_only();
public seg_bi(){
s.readDict();
a.readDict();
}
public static void main(String[] args)
{
seg_bi f = new seg_bi();
System.out.print(f.check_right("我正在上自然语言处理课."));
}
public String get_MMresult(){
return a.getResult();
}
public String get_RMMresult(){
return s.getResult();
}
public String get_result(){
return a.getResult();
}
public boolean check_right(String source){
int rmm_l = source.length();
s.RMM(source, 4, rmm_l-1);
a.MM(source, 4, 0);
return (s.getResult().equals(a.getResult()));
}
}
ps: 这里只贴出了几个主要的函数,可视化页面和整个代码可以上GitHub上看哦!