在scala中匹配单词/短语作为基础

时间:2016-11-18 09:59:51

标签: string scala pattern-matching match

我必须查找段落中是否存在给定的短语/单词。这是我所做的,给出了" 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等。任何帮助都将不胜感激。

2 个答案:

答案 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,您必须再次检查。