Java合并List

问题

在写我的毕业设计时,遇到了这样两个问题:

  1. 给定一个分词结果(List)与一个知道偏置的专有名词(特定领域命名实体)的结果(List),怎么将两者融合成一个统一的分词结果(List)。
  2. 给定一个分词结果(List)与一条规则(人为规定的分词结果(List)),怎么将规则整合到分词结果中,得到一个统一的分词结果(List)。

虽然在算法上没有多少难度,但是在实现上还是挺费时间思考,所以我将我的实现保存起来,以后没准我还会再用到。

方案

合并专有名词

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
public List<String> segTemp(List<String> tmp, List<Term> area, int len) {
List<String> ret = new ArrayList<String>();
int area_len = area.size();
if (area_len == 0) {
return tmp;
}
int index = 0;
int tmp_index = 0;
int tmp_i = 0;
int i = 0;
for (i = 0; i < tmp.size(); i++) {
if (index == area.get(tmp_i).getOffe()) {
ret.add(area.get(tmp_i).getRealName());
index += area.get(tmp_i).getRealName().length();
i--;
if (tmp_i < area_len - 1) {
tmp_i++;
continue;
} else {
break;
}
} else if (index > tmp_index) {
if (tmp_index + tmp.get(i).length() <= index){
tmp_index += tmp.get(i).length();
} else {
ret.add(tmp.get(i).substring(index - tmp_index));
tmp_index += tmp.get(i).length();
index = tmp_index;
}
} else if (index + tmp.get(i).length() <= area.get(tmp_i).getOffe()) {
ret.add(tmp.get(i));
index += tmp.get(i).length();
tmp_index += tmp.get(i).length();
} else if (index + tmp.get(i).length() > area.get(tmp_i).getOffe()
&& index < area.get(tmp_i).getOffe()) {
ret.add(tmp.get(i).substring(0, area.get(tmp_i).getOffe() - index));
index += area.get(tmp_i).getOffe() - index;
tmp_index += tmp.get(i).length();
}
}
// 从上一个位置break
for (int j = i + 1; j < tmp.size(); j++) {
if (index > tmp_index) {
if (tmp_index + tmp.get(j).length() <= index) {
tmp_index += tmp.get(j).length();
} else {
ret.add(tmp.get(j).substring(index - tmp_index));
tmp_index += tmp.get(j).length();
index = tmp_index;
}
} else {
ret.add(tmp.get(j));
}
}
return ret;
}

合并规则

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
public static List<String> match(String text, List<String> ori, List<Rule> rule){
if(rule.isEmpty()){
return ori;
}
List<String> ret = new ArrayList<String>();
boolean flag = false;
for(Rule ru : rule){
List<Integer> loc = getLocation(text,ru.toString());
if(loc.isEmpty()){
continue;
}else{
flag = true;
int num = loc.size();
int j = 0;
int idx = 0;
for(int i = 0; i< num;i++){
int tmp = loc.get(i);
while(idx+ori.get(j).length() < tmp){
ret.add(ori.get(j));
idx += ori.get(j).length();
j++;
}
if(ori.get(j).substring(idx+ori.get(j).length() - tmp) != null || !ori.get(j).substring(idx+ori.get(j).length() - tmp).equals("")){ ret.add(ori.get(j).substring(idx+ori.get(j).length() - tmp));
j++;
}
ret.addAll(ru.getRule());
while(j<ori.size()){
if(idx + ori.get(j).length() <= tmp+ru.toString().length()){
idx += ori.get(j).length();
j++;
}else if(idx + ori.get(j).length() > tmp+ru.toString().length() && idx < tmp + ru.toString().length()){
idx += ori.get(j).length();
ret.add(ori.get(j).substring(idx - (tmp + ru.toString().length() )));
j++;
}else{
break;
}
}
}
if(j<ori.size()){
for(int t = j;t < ori.size();t++){
ret.add(ori.get(t));
}
}
ori = ret;
}
}
if(flag == false){
return ori;
}
return ret;
}



The link of this page is https://blog.nooa.tech/articles/66999e7d/ . Welcome to reproduce it!

© 2018.02.08 - 2024.05.25 Mengmeng Kuang  保留所有权利!

:D 获取中...

Creative Commons License