Правильно ли, что:
- у вас есть последовательность слов (из вашего кода не ясно, должна ли она быть единственной строкой или полным файлом)
- n-грамм представляет собой последовательность из n слов, последовательных в исходной последовательности
- , вы хотите определенное количество различных n-грамм.
Существует процедура, которая даст вам n-грамм, это sliding
.с
val words = Seq("the", "brown", "fox", "jumps", "over", "the", "lazy", "dog")
val trigrams = words.sliding(3).toSeq
foreach(triGram in triGrams) println(triGram.mkString(" "))
the brown fox
brown fox jumps
fox jumps over
jumps over the
over the lazy
the lazy dog
Предостережение: если у вас есть только p слов и вы хотите n-грамм, при n> p скольжение вернет одну p-грамм (неn-грамм, очевидно), а не нет.Таким образом, вы должны проверить это.
Вы можете сделать toSet
вместо toSeq
для устранения дубликатов.
Последний пункт, вам нужно только определенное количество n-грамм (ваш последний аргумент).Вы не указали, как вы хотите их выбрать.Простой способ будет взять.Чтобы не проходить через весь список слов и взять count
первый отдельный, это будет
words.sliding(n).toStream.distinct.take(count)
Если вы хотите взять их в случайном положении, это другая история и, возможно,sliding
это не путь.