2016-11-18 33 views
1

我必须查找给定的短语/单词是否存在于某个段落中。这是我所做的,因为“词汇表”是我必须查找短语/单词的段落,而“单词”是短语/单词。以scala为基础的单词/短语

if (wordlist contains words){println(words)} 

不过这也确实字符串搜索为: "value of this" contains "val"true。只有在短语/单词按原样存在且不是“单词列表”中其他字符串的一部分的情况下,我才需要“真实”。因此,"value of this"包含"x"应给予true以下x值: "value", "value of", "this"等,并给false"val", "alue", "e of" "his"等任何帮助,将不胜感激。

+2

[scala完全匹配给定字符串中的单词]的可能重复(http://stackoverflow.com/questions/13652447/scala-exactly-matching-a-word-in-a-given-string) –

+1

使用'\ b' +'单词'+'\ b',或'(?<!\ S)'+'单词'+'(?!\ S)'。你可以解释一下这个吗? –

+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 
+0

不,我不想这样做,因为有我想要匹配的短语而且必须将它们配成短语而不是单词。 –

+0

这解决了我的问题,但已经减慢了我的代码。我必须在2500万条记录上进行匹配 –

0

我相信,使其更快,你需要建立一个索引(尽管因为你需要建立初始成本会很高索引,但匹配过程会更快)。否则,你将不得不遍历所有可能性,这将是缓慢的。

我以"value of this"为例。一个想法是,为所有短语组合建立一个基于字符数的Map(排序)。

value将是Map(Map(a -> 1, e -> 1, l -> 1, u -> 1, v -> 1) -> List(value))

value ofMap(Map( -> 1, a -> 1, e -> 1, f -> 1, l -> 1, o -> 1, u -> 1, v -> 1) -> List(value of))

等。

然后,当试图检查一个短语/单词是否存在时,您可以根据字符的频率进行匹配。你会得到一个List你必须再次检查。