我必须查找段落中是否存在给定的短语/单词。这是我所做的,给出了" wordlist"是我必须寻找短语/单词和#34;单词"是短语/单词。
float
但这也将子串搜索视为:
void*
是if (wordlist contains words){println(words)}
。我想"真的"仅在短语/单词按原样存在且不是"单词列表"中其他字符串的一部分的情况下。因此,"value of this" contains "val"
包含true
应该为以下x值提供"value of this"
:
"x"
等true
等"value", "value of", "this"
false
等。任何帮助都将不胜感激。
答案 0 :(得分:0)
这有点像尝试在列表中查找子列表,因此一种方法是将两者转换为单词列表,如下所示:
wordlist.split(" ") containsSlice words.split(" ")
从REPL看,它看起来符合您的要求(如果没有请展开!):
scala> def hasPhrase(wordList:String,words:String) = wordList.split(" ") containsSlice words.split(" ")
hasPhrase: (wordList: String, words: String)Boolean
scala> hasPhrase("value of this","value")
res13: Boolean = true
scala> hasPhrase("value of this","value of")
res14: Boolean = true
scala> hasPhrase("value of this","val")
res15: Boolean = false
scala> hasPhrase("value of this","his")
res16: Boolean = false
在大字符串或大量字符串中拆分两个字符串效率不高。如果您的用例允许,您可以将长短语分开一次(这样您就可以wordlistAsCollection containsSlice words.split(" ")
)。你也可以按照评论中的建议尝试一种正则表达式方法,也许可以按照以下方式进行:
def hasPhrase(wordList:String,words:String) =
new scala.util.matching.Regex("\\b"+words+"\\b")
.findFirstMatchIn(wordList)
.isDefined
答案 1 :(得分:0)
我相信你需要更快地建立一个索引(尽管初始成本会很高,因为你需要构建索引,但是匹配过程会更快)。否则你将不得不遍历所有可能性,这将是缓慢的。
我将以"value of this"
为例。一个想法是,为所有短语组合构建基于Map
(已排序)的字符数。
value
将是Map(Map(a -> 1, e -> 1, l -> 1, u -> 1, v -> 1) -> List(value))
。
value of
将为Map(Map( -> 1, a -> 1, e -> 1, f -> 1, l -> 1, o -> 1, u -> 1, v -> 1) -> List(value of))
等等。
然后,当试图检查短语/单词是否存在时,您可以根据字符的频率进行匹配。然后,您将获得List
,您必须再次检查。