我试图在文本中找到特定单词或复合词的出现。
例如,文字是“祝你生日快乐” 我必须匹配的短语是“生日快乐”。
我有一个需要与输入文本匹配的单词/短语词典。该词典由大约3000个单词/复合词组成。需要分析的文本数量可能会有所不同。现在我正在使用正则表达式。 \ b +短语+ \ b。。这给了我正确的答案,但速度很慢。
此外,可能在文本中找到的单词之前或之后是特殊字符,如!,:,.等
虽然text.contains()很快,但我不能使用它,因为它甚至对于单词的一个子集都返回true。我有什么方法可以更快地做到这一点吗?
答案 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());
来自以下网址的来源。有关详细信息,请查看以下网址。