毫无疑问,可能必须增加默认的 JVM 堆大小。我非常怀疑使用 split 或任何其他基于 RE 的方法对于这么大的输入是否容易处理。同样,如果您将输入转换为 aList[Char]
以利用精彩的集合库,您将看到内存需求过度增加;规模膨胀将至少是十进制数量级。
鉴于相对简单的分解(由空格或标点符号分隔的单词),我认为可能需要一个更平淡的解决方案。强制迭代字符串的字符(但不是通过隐式转换为任何类型的Seq[Char]
)并找到单词,将它们转储到mutable.Set[String]
. 一方面,这将消除重复。或许使用 aBuffer[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)