string - Scala 大文本文件

标签 string scala nlp

我是 Scala 编程的新手。

我必须处理一项NLP任务。

我在 Scala处理大型文本文件时遇到问题。

我已经将一个 100+ M.B 文件的整个文本读入内存(变成一个字符串)并且必须对其进行处理(我相信处理大型文本文件是自然语言处理中的一项常见任务)。

目标是计算给定字符串(即整个文件)中唯一子字符串/单词的数量。

我想在 List 对象中使用“distinct”方法,但是将字符串转换为列表使用“.split ”方法引发内存不足错误(“java.lang.OutOfMemoryError:Java 堆空间”错误)。

我想知道我是否可以在不使用 Scala 中使用字符串或正则表达式方法的列表的情况下完成这项任务?

最佳答案

毫无疑问,默认的 JVM 堆大小可能必须增加。我非常怀疑使用 split 或任何其他基于 RE 的方法对于这么大的输入是否容易处理。同样,如果将输入转换为 List[Char] 以利用出色的集合库,您将看到内存需求的过度增加;尺寸膨胀至少是十进制数量级。

考虑到相对简单的分解(由空格或标点符号分隔的单词),我认为可能需要一个更平淡无奇的解决方案。强制迭代字符串的字符(但不是通过隐式转换为任何类型的 Seq[Char])并找到单词,将它们转储到 mutable.Set[String]。一方面,这将消除重复项。也许使用 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)

关于string - Scala 大文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14491756/

相关文章:

python - Doc2Vec找到相似的句子

java - 从字符串到 Clob 以及 Clob 到字符串的转换

c - 如何根据 C 中的多个定界符分隔字符串?

scala - `Data.Map` 没有 Monad 实例,但是 Scala 的 Map?

python - 替换python字符串中的特殊字母

machine-learning - 右填充与左填充词向量?

php - 如何在html文本区域中逐句获取字符串

javascript - 如何在 Javascript 中连接数组对象和字符串以获取字符串?

scala - 从二进制文件读取 Scala

Scala:通过方法进行隐式转换(例如 toString)