我正在开发一个机器学习项目,我正在构建一个关于中文文本的朴素贝叶斯分类器。我想使用n-gram的汉字作为特征,所以我需要能够将文本分成unigrams(单个字符),bigrams(两个字符的序列),等等。 (我不关心特殊的标记化等等 - 我只想要原始字符作为n-gram。)
如何在Scala中执行此操作?我试过text.sliding(2)
来获取bigrams,但这似乎并不合适。 (我猜是因为汉字不是像英文一样的单字节?)
答案 0 :(得分:3)
一般来说,这是一个关于在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函数,这些函数将提取你需要的东西,当然这些是简单的天真实现。
答案 1 :(得分:0)
试试mecab。我使用mecab为日文和中文创建令牌。一旦安装了mecab ......就是python api。
参见此参考文献。
n-gram name analysis in non-english languages (CJK, etc)
请参阅有关如何安装mecab的信息。