2016-11-18 79 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你必須再次檢查。

相關問題