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]