如何在文本中找到复合词的出现

时间:2013-04-08 09:33:02

标签: java string

我试图在文本中找到特定单词或复合词的出现。

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

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

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

虽然text.contains()很快,但我不能使用它,因为它甚至对于单词的一个子集都返回true。我有什么方法可以更快地做到这一点吗?

4 个答案:

答案 0 :(得分:4)

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

例如,字符串:

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]))

答案 1 :(得分:0)

试试这个:(“”+ test +“”)。withtains(“”+ phrase +“”);

这应该涵盖三个条件 -

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

想不出任何其他情况......

答案 2 :(得分: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

答案 3 :(得分: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());

来自以下网址的来源。有关详细信息,请查看以下网址。

Matcher