飞行时代网站建设,免费源码资源站,c 网站开发框架,长沙百家号seo本文实例讲述了java实现的最大匹配分词算法。分享给大家供大家参考#xff0c;具体如下#xff1a;全文检索有两个重要的过程#xff1a;1分词2倒排索引我们先看分词算法目前对中文分词有两个方向#xff0c;其中一个是利用概率的思想对文章分词。 也就是如果两个字#x…本文实例讲述了java实现的最大匹配分词算法。分享给大家供大家参考具体如下全文检索有两个重要的过程1分词2倒排索引我们先看分词算法目前对中文分词有两个方向其中一个是利用概率的思想对文章分词。 也就是如果两个字一起出现的频率很高的话我们可以假设这两个字是一个词。这里可以用一个公式衡量m(a,b)p(ab)/p(a)p(b)其中 a表示一个字b表示一个字p(ab)表示ab相邻出现的概率p(a)表示a在这篇文章中的频度p(b)表示b在这篇文章中的频度。用概率分词的好 处是不需要借助词典的帮助坏处是算法比较麻烦效率不高也存在一定的出错率。另外的一个方向是使用词典分词。就是事先为程序准备一个词典然后通过这个词典对文章分词。目前较流行的方式有正向最大匹配算法和逆向最大匹配算法。逆向最大匹配算法在准确性上要更好一些。以 “我是一个坏人” 为例并最大词长为词库包含有 我、是、一、个、一个、坏人、大坏人正向的顺序为我是一我是我 得到一个词是一个是一是 得到一个词一个坏一个 得到一个词坏人得到一个词结果 我、是、一个、坏人反向算法个坏人坏人 坏人是一个一个 一个我是是 是我 我结果 我、是、一个、坏人java代码如下package data;import java.util.arrays;import java.util.hashset;import java.util.set;/*** 最大匹配分词算法** author jyc506**/public class splitstring {private set set new hashset();private int positiveover 0;private int reverseover 0;/*** 正向最大匹配** param str 要分词的句子* param num 词的最大长度* return*/public string[] positivesplit(string str, int maxsize) {int tem 0;int length str.length();string[] ss new string[length];char[] cc str.tochararray();for (int i 0; i length; i) {positiveover 0;string sb 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*/public void addword(string[] words) {for (string st : words) {this.set.add(st);}}/*** 逆向最大匹配** param str* param num* return*/public string[] reversesplit(string str, int num) {int tem 0;int length str.length();string[] ss new string[length];char[] cc str.tochararray();for (int i str.length() - 1; i -1; i--) {reverseover 0;string sb 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;}private string tostr(char[] cs, int start, int num) {int num2 num;out: for (int j 0; j num; j) {stringbuffer sb new stringbuffer();for (int i 0; i num2; i) {if (start i cs.length) {sb.append(cs[start i]);} else {num2--;j--;continue out;}}if (set.contains(sb.tostring())) {positiveover num2 - 1;return sb.tostring();}num2--;}return string.valueof(cs[start]);}private string tostr2(char[] cs, int start, int num) {int num2 num;for (int j 0; j num; j) {stringbuffer sb new stringbuffer();for (int i 0; i num2; i) {int index start - num2 i 1;if (index -1) {sb.append(cs[index]);} else {num2--;}}if (set.contains(sb.tostring())) {reverseover num2 - 1;return sb.tostring();}num2--;}return string.valueof(cs[start]);}public static void main(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.positivesplit(st, 4);system.out.println(正向最大匹配分词算法分词结果 arrays.tostring(ss1));system.out.println(逆向最大匹配分词算法分词结果 arrays.tostring(ss2));}}希望本文所述对大家java程序设计有所帮助。希望与广大网友互动点此进行留言吧