2016-11-18 2 views
1

Я должен найти, существует ли определенная фраза/слово в абзаце или нет. Вот что я сделал, поскольку «wordlist» - это абзац, в котором я должен искать фразы/слова и «слова» - это фраза/слово.Соответствующие слова/фразы в scala on as являются базовыми

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

Но это также делает поиск подстроки как: "value of this" contains "val" является true. Я хочу «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' +' word' + '\ b', или' (?

+0

Не могли бы вы объяснить это, пожалуйста? –

ответ

0

Это немного похоже на попытку найти подсписок в списке, так что один подход будет конвертировать и в списки слов, а именно:

wordlist.split(" ") containsSlice words.split(" ") 

С РЕПЛ, похоже, это отвечает ваши требования (если нет, пожалуйста, расширить!):

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

это решает мою проблему, но замедляет мой код. Я должен сделать это на 25 миллионов записей –

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, который вы должны проверить еще раз.