首页 > 编程知识 正文

JAVA怎么使用结巴分词,内容分词算法

时间:2023-05-04 04:19:07 阅读:107009 作者:4031

本文实例阐述了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,ss2,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,num );

tem;

ss[--length]=sb;

i=i - reverSEOver;

}

String[] ss2=new String[tem];

system.arraycopy(ss,str.length )- tem,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 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 (string [ ] 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编程有帮助。

总结

如果你觉得编程主页的内容不错,欢迎向程序员朋友推荐程序员网站。

此文字内容来源于网民的互联网收集整理提供,仅供学习参考,版权归原作者所有。

如果喜欢交流学习经验,请点击链接加入交流1群: 1065694478 (满)交流2群: 163560250

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。