デフォルトの JVM ヒープ サイズをおそらく増やす必要があることは確かです。スプリットやその他のREベースのアプローチを使用することが、その大きな入力に対して扱いやすいかどうかは大いに疑問です。List[Char]
同様に、素晴らしいコレクション ライブラリを利用するために入力を に変換すると、メモリ要件が過度に増加することがわかります。サイズの膨張は、最小で 10 進数の桁数になります。
比較的単純な分解 (空白または句読点で区切られた単語) を考えると、より平凡な解決策が必要になる可能性があると思います。文字列の文字を命令的に反復し (ただし、任意の種類の への暗黙的な変換を介してではありませんSeq[Char]
)、単語を見つけて にダンプしますmutable.Set[String]
。一つには、それは重複を排除します。おそらく、 a を使用しBuffer[Char]
て各単語の文字を蓄積してから、それらを に変換しString
て に追加しますSet[String]
。
ここにカットがあります:
package rrs.scribble
object BigTextNLP {
def btWords(bt: String): collection.mutable.Set[String] = {
val btLength = bt.length
val wordBuffer = collection.mutable.Buffer[Char]()
val wordSet = collection.mutable.Set[String]()
/* Assuming btLength > 0 */
import bt.{charAt => chr}
import java.lang.Character.{isLetter => l}
var inWord = l(chr(0))
(0 until btLength) foreach { i =>
val c = chr(i)
val lc = l(c)
if (inWord)
if (lc)
wordBuffer += c
else {
wordSet += wordBuffer.mkString
wordBuffer.clear
inWord = false
}
else
if (lc) {
inWord = true
wordBuffer += c
}
}
wordSet
}
}
REPL では:
scala> import rrs.scribble.BigTextNLP._
import rrs.scribble.BigTextNLP._
scala> btWords("this is a sentence, maybe!")
res0: scala.collection.mutable.Set[String] = Set(this, maybe, sentence, is, a)