Как сделать последовательность строк путем сопоставления в Scala? - PullRequest
1 голос
/ 19 ноября 2011
object NGram{
    def main(args: Array[String]) {
      //args(0) = textfile //args(1) = size of n-grams //args(2) = the number of words to generate
        val F = scala.io.Source.fromFile(args(0)) // take from args[0]
        for (line <- F.getLines()){
        val words = line.split("[ ,:;.?!-]+") map (_.toLowerCase)
        var ngram : Set[String] = Set()
        //make n-gram
        for(i <- 0 to words.size - args(1)) {
          // first make sequence by args(1)
          for(j <- i until i + args(1)){
            ngram = ngram + words(j) // not works it is my problem stage
          }


          }
        }
    }
}

Я сделал n-граммовый алгоритм с использованием scala. сначала

  1. создайте последовательность строк и убедитесь, что она в исходной строке.
  2. и это эффективно работает.

Я хочу, чтобы последовательность n строк не дублировалась (потому что она должна работать эффективно)

Как составить n последовательностей строк по карте?

1 Ответ

3 голосов
/ 19 ноября 2011

Правильно ли, что:

  • у вас есть последовательность слов (из вашего кода не ясно, должна ли она быть единственной строкой или полным файлом)
  • 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 это не путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...