在R中使用亚洲/中文字符创建n-gram?

4

我正在尝试创建一个给定文本集的二元组和三元组,这恰好是中文。乍一看,tau程序包似乎非常适合此应用。根据以下设置,我已经接近所需:

library(tau)
q <- c("天","平","天","平","天","平","天","平","天空","昊天","今天的天气很好")
textcnt(q,method="ngram",n=3L,decreasing=TRUE)

唯一的问题是输出是Unicode字符字符串,而不是字符本身。所以我得到了类似这样的东西:
  _   +   <  <U <U+   >   U  U+   9  +5   5 U+5  >_  _< _<U +59  59   2  29 29> 592   7  92 
 22  19  19  19  19  19  19  19  17  14  14  14  11  11  11   9   9   8   8   8   8   8   8 
929  9>  >< ><U 9>_   E +5E   3  3> 3>_  5E 5E7   6  73 73>   A  E7 E73   4   8 9><  A>  +6 
  8   8   8   8   5   5   4   4   4   4   4   4   4   4   4   4   4   4   3   3   3   3   2 
 +7  4> 4><  7A A><   C U+6 U+7  +4 +4E +5F +66 +6C +76 +7A   0  0A 0A>   1  14 14>  4E 4EC 
  2   2   2   2   2   2   2   2   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
597  5F 5F8  60 60A  66 660  68 684  6C 6C1  76 768 7A7 7A>  7D 7D>  84 84>  88 88>  8> 8>< 
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
 97 97D  A7 A7A A>_  C1 C14  CA CA>   D  D> D>_  EC ECA   F  F8 F88 U+4 
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 

我试图编写一个类似的功能,但是除了单字母缩写外,我无法理解任何更复杂的代码(如果代码不够高效或难看,请见谅,我尽力了)。这种方法的优点也在于,我可以通过简单地检查DTM来获取每个“文档”内的单词计数,这还是挺好的。

data <- c(NA, NA, NA)
names(data) <- c("doc", "term", "freq")

terms <- NA
for(i in 1:length(q)){

  temp <- data.frame(i,table(strsplit(q[i],"")))
  names(temp) <- c("doc", "term", "freq")
  data <- rbind(data, temp)

}
data <- data[-1,]

DTM <- xtabs(freq ~ doc + term, data)
colSums(DTM)

这实际上提供了一个不错的输出:
天 平 空 昊 今 好 很 气 的 
 8  4  1  1  1  1  1  1  1 

有没有人有关于使用tau或修改自己的代码来实现中文字符的二元组和三元组的建议?

编辑:

根据评论的要求,这是我的sessionInfo()输出:

R version 3.0.0 (2013-04-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] tau_0.0-15

loaded via a namespace (and not attached):
[1] tools_3.0.0

1
textcnt 在哪个软件包中? - Tyler Rinker
1
你对 textcnt 的调用确实保留了字符:你可能只是有一个编码问题。你的 sessionInfo() 是什么? - Vincent Zoonekynd
@TylerRinker 我正在使用tau包中的textcnt命令。 @VincentZoonekynd 我已经更新了原始帖子,并附上了sessionInfo()输出,但我不太确定如何解释它。 - user2340494
1
你应该将编码从 1252(Windows特定的拉丁编码)更改为能够处理中文字符的编码,例如 UTF-8 - Vincent Zoonekynd
@VincentZoonekynd 经过尝试更改编码的多次尝试后,我已经将Sys.setlocale("LC_CTYPE", "English_United States.utf8")编辑到了我的Rprofile.site文件中。但是我仍然收到一个错误:OS报告无法满足设置区域设置为“English_United States.utf8”的请求。我走对了吗? - user2340494
1个回答

1

stringdist 包可以帮助你完成这个任务:

> library(stringdist)

> q <- c("天","平","天","平","天","平","天","平","天空","昊天","今天的天气很好")

> v1 <- c("天","平","天","平","天","平","天","平","天空","昊天","今天的天气很好")

> t(qgrams(v1, q=1))
   V1
天  8
平  4
空  1
昊  1
...

> v2 <- c("天气气","平","很好平","天空天空天空","昊天","今天的天天气很好")

> t(qgrams(v2, q=2))
     V1
天气  2
气气  1
空天  2
天空  3
天的  1
天天  3
今天  1
...

我之所以要转置返回的矩阵,是因为R在列宽方面呈现矩阵时存在问题,这与Unicode-ID字符串的长度有关(例如 "<U+6C14><U+6C14>")。
如果您对stringdist包有进一步了解的话,我建议阅读这篇文章:http://www.joyofdata.de/blog/comparison-of-string-distance-algorithms ;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接