1

我正在尝试查找文本中特定单词或复合词的出现。

例如,文本是“祝你生日快乐”,而我必须匹配的短语是“生日快乐”。

我有一个需要与输入文本匹配的单词/短语字典。这本词典由大约3000个单词/复合词组成。需要分析的文本数量可能会有所不同。现在我正在使用正则表达式。\b+短语+\b。. 这给了我正确的答案,但速度很慢。

此外,可能在文本中找到的单词前面或后面有特殊字符,如!,:,。等等

尽管 text.contains() 很快,但我不能使用它,因为即使对于单词的子集它也会返回 true。有什么办法可以让我更快地做到这一点?

4

4 回答 4

4

您可以将字符串拆分为单词数组并使用Knuth-Morris-Pratt 算法,但不是比较字符串中的字符,而是比较数组中的单词。

例如,字符串:

i bought a hat in manhattan

将其拆分为数组:

S = {"i","bought","a","hat","in","manhattan"}

如果您正在查找单个单词,只需将您正在查找的单词与此数组中的每个单词进行比较。

如果您正在寻找一系列单词,例如:

W = {"a","hat","in"}

使用 KMP。明确地,参考维基百科定义的算法,如上所述设置 S 和 W,当算法状态为 时if W[i] = S[m + i],您可以通过以下方式在 java 中实现:

if(W[i].equals(S[m+i]))
于 2013-04-08T10:16:58.860 回答
0

试试这个: (" " + test + " ").contains(" " + 短语 + " ");

这应该包括三个条件——

当测试字符串以短语开头或以短语结尾时,我们的包含仍然会找到该字符串。当短语在中间时,它会找到短语。当短语包含空格时,我们仍然可以...

想不出其他情况了...

于 2013-04-08T10:07:02.223 回答
0

我使用了很多indexOf()和的substring()方法java.lang.String,这可能会降低代码的性能,但下面的代码可以作为迈向这种方法的第一步。

public class MultiWordCompare {

    private static boolean containsWord(String word, String search) {
        if(word.indexOf(search) >= 0) { // Try if the word first exists at all
            try {
                String w = word.substring(word.indexOf(search), word.indexOf(search)+search.length()+1); //+1 to capture possible space
                if(w.lastIndexOf(" ") == w.length()-1) { //if the last char is space, then we captured the whole word
                    w = w.substring(0, w.length()-1); //remove space
                    return w.equals(search); //do string compare
                }
            }
            catch(Exception e) {
                //catching IndexOutofBoundException
            }
        }
        return false;
    }

    public static void main(String [] args) {
        System.out.println(containsWord("New York is great!", "New York"));
        System.out.println(containsWord("Many many happy Returns for the day", "happy Returns"));
        System.out.println(containsWord("New Authority", "New Author"));
        System.out.println(containsWord("New York City is great!", "N Y C"));
    }

}

这是输出

true
true
false
false
于 2013-04-08T10:10:40.923 回答
0
     String text    =
                "This is the text to be searched " +
                 "for occurrences of the http:// pattern.";

     String patternString = "This is the";

     Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
     Matcher matcher = pattern.matcher(text);

     System.out.println("lookingAt = " + matcher.lookingAt());
     System.out.println("matches   = " + matcher.matches());

来自以下网址。有关更多详细信息,请检查以下网址一次。

匹配器

于 2013-04-19T06:32:26.543 回答