2011-11-19 51 views
1
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 
      } 


      } 
     } 
    } 
} 

我用scala製作n-gram算法。起初如何通過在scala中映射來創建字符串序列?

  1. 使字符串序列,並檢查它是在原始字符串。
  2. 它是有效的工作。

我想ň串序列不重複(因爲它必須有效地工作)

如何通過地圖從N串序列?

回答

3

我是正確的是:

  • 你的字序列(從您的代碼不知道它是否應該爲單行或整個文件)
  • n元是一個序列在原始序列中連續n個字
  • 你想要一定數量的不同n元組。

有一個例程,會給你n-grams,它是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-gram,其中n> P,滑動會返回一個P-克(不是N-克顯然)而不是沒有。所以你必須檢查。

您可以做toSet而不是toSeq以消除重複。

最後一點,你只需要一定數量的n元組(你的最後一個參數)。你沒有指定你想如何選擇它們。簡單的方法將是一個需要。爲了避免逐一檢查這些詞彙的整個列表,並採取count第一截然不同的一個,這將是

words.sliding(n).toStream.distinct.take(count) 

如果你想利用他們在隨機位置,這是一個不同的故事,也許sliding不是要走的路。

相關問題