Java 用难解的短语分割文本
我有一个列表,里面有一些难解的单词,比如Java 用难解的短语分割文本,java,nlp,gate,Java,Nlp,Gate,我有一个列表,里面有一些难解的单词,比如 List<String> lookUp = new ArrayList<>(); lookUp.add("New York"); lookUp.add("Big Apple"); 它应该会回报我 ["New York", "is", "also", "called", "Big Apple"] 我开始写一个算法,首先用空格分割句子,然后我做一个循环:对于每个单词,我检查这个单词和它的右邻居是否出现在查找列表中,如果是真的,将这
List<String> lookUp = new ArrayList<>();
lookUp.add("New York");
lookUp.add("Big Apple");
它应该会回报我
["New York", "is", "also", "called", "Big Apple"]
我开始写一个算法,首先用空格分割句子,然后我做一个循环:对于每个单词,我检查这个单词和它的右邻居是否出现在查找列表中,如果是真的,将这些单词一起解析
1) 想象一下,我的查找列表也包含两个以上单词的难解短语,如“George W.Bush”->我的算法只查找“George W.”和“W.Bush”,在查找列表中找不到,因此它会将其拆分为3个单词
2) 更重要的问题(你可以忽略问题1):是否已经有一个库,甚至是一个门插件(这样我就不必重新发明轮子)?这是否也适用于德语短语?我在
Java7
上找不到一个=(另一个不使用正则表达式的实现:
List<String> lookUp = new ArrayList<>();
lookUp.add("New York");
lookUp.add("New Jersey");
lookUp.add("Big Apple");
lookUp.add("George W. Bush");
String sentence = "New York is also called Big Apple . New Jersey is located near to New York . George W. Bush doesn't live in New Mexico`";
String currentPhrase = "";
List<String> parseResult = new ArrayList<>();
for (String word : sentence.split("\\s+")) {
currentPhrase += (currentPhrase.isEmpty() ? "" : " ") + word;
if (lookUp.contains(currentPhrase)) {
parseResult.add(currentPhrase);
currentPhrase = "";
continue;
}
boolean phraseFound = false;
for (String look : lookUp)
if (look.startsWith(currentPhrase)) {
phraseFound = true;
break;
}
if (!phraseFound) {
parseResult.addAll(Arrays.asList(currentPhrase.split("\\s+")));
currentPhrase = "";
}
}
System.out.println(parseResult);
这是一个非常琐碎的问题,所以我相信:没有任何专门的库来解决这个问题。如果你得到“abc”并且在你的查找中有“abc”和“bc”怎么办?另一种方法是:1)按lookup
entries拆分,2)迭代,每次查看是否是一个查找词,3)如果是,继续,4)如果不是,空格分割。你能详细说明你的第一步吗?@aioobe:好的,我想我更喜欢接收[“a b”,“c”,“a”,“b c”]@jensgram:“1)按查找条目分割”你的意思是:句子。分割(查找。获取(I))?!或者只为(短语:查找){检查句子是否包含短语}工作!现在想象一下,您的查找列表中有“乔治·W”和“乔治·W·布什”:它应该被解析为“乔治·W·布什”(而不是“乔治·W”、“布什”)。。。。但这远远超出了我的问题:我玩了一点。当我的查找列表包含很多项时,它会失败。具体来说:如果你再添加100个短语进行查找,那么它将逐字拆分句子(是的,句子包含查找中的短语!)我对此感到困惑=/忘记我的上一条评论,这是我的一个错误:解决我的第一条评论的一个小方法:使用String[]splitted句子=句子。拆分(\\s+)编码>并使用i
执行循环。在if(lookUp.contains(currentphase))之后插入if(i
List<String> lookUp = new ArrayList<>();
lookUp.add("New York");
lookUp.add("New Jersey");
lookUp.add("Big Apple");
lookUp.add("George W. Bush");
String sentence = "New York is also called Big Apple . New Jersey is located near to New York . George W. Bush doesn't live in New Mexico`";
String currentPhrase = "";
List<String> parseResult = new ArrayList<>();
for (String word : sentence.split("\\s+")) {
currentPhrase += (currentPhrase.isEmpty() ? "" : " ") + word;
if (lookUp.contains(currentPhrase)) {
parseResult.add(currentPhrase);
currentPhrase = "";
continue;
}
boolean phraseFound = false;
for (String look : lookUp)
if (look.startsWith(currentPhrase)) {
phraseFound = true;
break;
}
if (!phraseFound) {
parseResult.addAll(Arrays.asList(currentPhrase.split("\\s+")));
currentPhrase = "";
}
}
System.out.println(parseResult);
[New York, is, also, called, Big Apple, ., New Jersey, is, located, near, to, New York, ., George W. Bush, doesn't, live, in, New, Mexico]