国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java實現的最大匹配分詞算法詳解

Java實現的最大匹配分詞算法詳解

2021-01-05 11:18送人玫瑰手留余香 Java教程

這篇文章主要介紹了Java實現的最大匹配分詞算法,簡單說明了最大匹配分詞算法的原理并結合具體實例形式最大匹配分詞算法的實現方法與相關注意事項,需要的朋友可以參考下

本文實例講述了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代碼如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package data;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
 * 最大匹配分詞算法
 *
 * @author JYC506
 *
 */
public class SplitString {
 private Set<String> set = new HashSet<String>();
 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實現的最大匹配分詞算法詳解

希望本文所述對大家java程序設計有所幫助。

原文鏈接:http://blog.csdn.net/h348592532/article/details/45537487

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩精品一区在线 | 成av在线 | 成人黄色免费 | 伊人伊人 | 免费骚视频 | 福利资源在线观看 | 不卡一区| 神马电影午夜 | 毛片免费观看 | 成人福利视频网 | 国产第一区二区三区 | 欧美激情一区二区三级高清视频 | 亚洲精品一二区 | 中文字幕在线观看视频地址二 | 九色av | 91精品久久| av激情在线 | 日韩在线中文字幕 | 久草免费在线视频 | 亚洲精品一区二区三区樱花 | 91精品久久久久久久久久入口 | 北条麻妃在线一区二区 | 毛片免费毛片一级jjj毛片 | 私人毛片免费高清视频 | 久久久精品国产 | 欧美成人一区二区 | 成人精品在线 | 黄片毛片在线 | 涩涩综合 | 免费一级毛片免费播放 | 亚洲国产精品一区二区三区 | 中文字幕三区 | 日韩精品免费在线视频 | 青青久草在线 | 久久成| 精品国产乱码久久久久久牛牛 | 国产欧美日韩一区二区三区 | 成人免费视频观看 | 精品96久久久久久中文字幕无 | 精品无人乱码一区二区三区 | 亚洲精品综合 |