最大匹配分词算法如何在Java项目中实现
发布时间: 2020-12-05 16:11:30
来源:亿速云
阅读: 67
作者: Leah
最大匹配分词算法如何在Java项目中实现? 针对这个问题,本文详细介绍了相应的分析和答案,希望能帮助很多想解决这个问题的伙伴找到更简单易行的方法。
全文检索有两个重要的过程。
1分词
2转置索引
我们先来看看分词算法
目前汉语分词有两个方向,其一是用利用概率的思想对文章进行分词。 也就是说如果两个字一起出现的频率很高,我们就可以假设这两个字是一个词。 这里,可以用m(a,b )=p ) AB )/p ) a ) p ) b )这样的公式来测量。 其中,a表示单词,b表示单词,p ) AB表示AB相邻出现的概率,p(a )表示这篇文章中a的频率,p ) b )表示这篇文章中b的频率。 使用概率分词的好处是不需要借助词典。 缺点是算法麻烦,效率低,还存在一定的错误率。
另一个方向是使用词典。 为程序准备词典,用该词典分写文章。 目前流行的方式包括前向最大匹配算法和反向最大匹配算法。 反向最大匹配算法的准确性更好。
以“我是坏人”为例,最大的词长是3,词典里包括我、是的、一、一、坏人、大坏人
顺方向的顺序是
我是一个人
我是的
我==得到语言
是一个
第一个
是的===得到语言
一个坏的
一个===得到一个词
坏人===得到语言
结果是,是的,一个人,坏人
反向运动学
坏人
坏人==坏人
是一个
一块==一块
我是的
是==是
我==我
结果是,是的,一个人,坏人
java代码如下所示
包数据;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
//*
*最大匹配分词算法
*
* @author JYC506
*
*/
公共类拆分字符串{
private Set set=new HashSet (;
private int positiveOver=0;
私有int reverse over=0;
//*
*正向最大匹配
*
* @param str词连写的句子
* @param num语的最大长度
* @return
*/
公共字符串[ ] positive split (stringstr,int maxSize )。
int tem=0;
int length=str.length (;
String[] ss=new String[length];
char[] cc=str.toCharArray (;
for(intI=0; i length; I ) {
positiveOver=0;
stringsb=this.tostr(cc,I,maxSize );
ss[tem ]=sb;
i=i positiveOver;
}
String[] ss2=new String[tem];
system.arraycopy(ss,0,ss2,0,tem );
return ss2;
}
//*
添加词典
*
* @param words
*/
publicvoidaddword (string [ ] words )
字符串: words (for ) {
this.set.add(ST;
}
}
//*
反向最大匹配
*
* @param str
* @param num
* @return
*/
公共字符串[ ] reverse split (stringstr,int num ) {
int tem=0
int length=str.length (;
String[] ss=new String[length];
char[] cc=str.toCharArray (;
for(intI=str.Length ) (- 1; i -1; I----) {
reverseOver=0;
stringsb=this.tostr2(cc,I,num );
tem;
ss[--length]=sb;
i=i - reverseOver;
}
String[] ss2=new String[tem];
system.arraycopy(ss,str.length )- tem,ss2,0,tem );
return ss2;
}
privatestringtostr(char[]cs,int start,int num ) {
int num2=num;
out:for(intj=0; j num; j ) {
StringBuffer sb=new StringBuffer (;
for(intI=0; i num2; I ) {
开始ics.length (if ) {
sb.append(cs[startI] );
} else {
num2----;
j----;
连续输出;
}
}
if(set.contains(sb.tostring () ) ) ) ) ) ) ) ) )。
positiveOver=num2 - 1;
return sb.toString (;
}
num2----;
}
returnstring.valueof(cs[start];
}
privatestringtostr2(char[]cs,int start,int num ) {
int num2=num;
for(intj=0; j num; j ) {
StringBuffer sb=new StringBuffer (;
for(intI=0; i num2; I ) {
int index=start - num2 i 1;
if (索引-1) {
sb.append(cs[index];
} else {
num2----;
}
}
if(set.contains(sb.tostring () ) ) ) ) ) ) ) ) )。
reverseOver=num2 - 1;
return sb.toString (;
}
num2----;
}
returnstring.valueof(cs[start];
}
publicstaticvoidmain (字符串[ ] args ) {
String[] words=new String[] { '我们','我们五个人','五人一组','一组' };
SplitString ss=new SplitString (;
/*向词典添加单词*
ss.addword(words;
String st='我们五人一组';
System.out.println (亿速云测试结果();
System.out.println ('分隔开的语句: ' st );
/*用两种方式分词。 其次,最大字长为4*/
string[]ss2=ss.reversesplit(ST,4 );
string [ ] ss1=ss.positive split (ST,4 );
System.out.println (前向最大匹配分词算法分词结果(Arrays.tostring(ss1 ) );
System.out.println (反向最大匹配分词算法分词结果(Arrays.tostring ) ss2 );
}
}
关于最大匹配分词算法如何在Java项目中实现问题的解答,在这里进行了共享。 希望以上内容对大家有帮助。 如果还有很多疑问没有解开的话,可以关注亿速云行业信息频道了解更多的知识。