Следующий код выполняет неперекрывающуюся маркировку предложения, отдавая приоритет более длинным совпадениям.
Он обрабатывает предложение как массив строковых токенов.
Он использует параметр "max_key_size" (максимальный размер ключа в вашем словаре), чтобы избежать поиска совпадений, которые никогда не произойдут.
В вашем примере результирующее предложение:
[[Лос-Анджелес Лейкерс], посетили, [Вашингтон], [Штат], в прошлом, неделю]
Надеюсь, это поможет:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
public class NonOverlappingTagging {
private static ArrayList non_overlapping_tagging(String[] sentence, HashMap dict,int max_key_size) {
ArrayList tag_sentence = new ArrayList();
int N = sentence.length;
if (max_key_size == -1) {
max_key_size = N;
}
int i = 0;
while (i < N) {
boolean tagged = false;
int j = Math.min(i + max_key_size, N); //avoid overflow
while (j > i) {
String[] literal_tokens = Arrays.copyOfRange(sentence, i, j);
String literal = join(literal_tokens, " ");
System.out.println(literal);
if (dict.get(literal) != null) {
tag_sentence.add("["+literal+"]");
i = j;
tagged = true;
}
else {
j -= 1;
}
}
if (!tagged) {
tag_sentence.add(sentence[i]);
i += 1;
}
}
return tag_sentence;
}
private static String join(String[] sentence, String separator) {
String result = "";
for (int i = 0; i < sentence.length; i++) {
String word = sentence[i];
result += word + separator;
}
return result.trim();
}
public static void main(String[] args) {
String[] sentence = {"Los", "Angeles", "Lakers", "visited", "Washington", "State", "last", "week"};
HashMap <String, Integer>dict = new HashMap();
dict.put("Los Angeles", 1);
dict.put("Lakers", 1);
dict.put("Los Angeles Lakers", 1);
dict.put("Washington", 1);
dict.put("State", 1);
dict.put("Washington State University", 1);
ArrayList tagging = non_overlapping_tagging(sentence, dict, -1);
System.out.println(tagging);
}
}