问题
在写我的毕业设计时,遇到了这样两个问题:
- 给定一个分词结果(List)与一个知道偏置的专有名词(特定领域命名实体)的结果(List),怎么将两者融合成一个统一的分词结果(List)。
- 给定一个分词结果(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(); } } 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!