我正在做一个机器学习项目,我在中文文本上构建一个朴素贝叶斯分类器。我想使用 n-gram 汉字作为特征,所以我需要能够将文本拆分为 unigrams(单个字符)、bigrams(两个字符的序列)等等。(我不关心特殊的标记化之类的——我只想要原始字符作为 n-gram。)
我如何在 Scala 中做到这一点?我试图text.sliding(2)
获得二元组,但这似乎并不奏效。(我猜是因为汉字不像英文那样是一个字节?)
我正在做一个机器学习项目,我在中文文本上构建一个朴素贝叶斯分类器。我想使用 n-gram 汉字作为特征,所以我需要能够将文本拆分为 unigrams(单个字符)、bigrams(两个字符的序列)等等。(我不关心特殊的标记化之类的——我只想要原始字符作为 n-gram。)
我如何在 Scala 中做到这一点?我试图text.sliding(2)
获得二元组,但这似乎并不奏效。(我猜是因为汉字不像英文那样是一个字节?)
一般来说,这是一个关于在 Java 中正确处理 Unicode 的问题,因此也是关于 Scala 的问题。从我对互联网的粗略浏览来看,似乎没有“一种真正的方法”来处理 Java 中的 Unicode。我不是 NLP 人,所以我对您想要做什么的理解可能不正确。
val text = "囗土夊米"
val unigrams = text.toCharArray
/* With the constraint unigrams is even, without the toString you get weird coercions */
val bigrams =
for (i <- 0 until unigrams.length if i % 2 == 0) yield unigrams(i).toString + unigrams(i + 1)
类似的东西应该很容易推广到一组 n-gram 函数,这些函数将提取你需要的东西,这些当然是简单的幼稚实现。
试试mecab。我使用 mecab 为日语和中文创建令牌。一旦安装了 mecab……python api。
请参阅此参考。
有关如何安装 mecab,请参阅此内容。