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

时间:2013-05-01 19:10:01

标签: r unicode

所以我试图创建一组给定文本的双字母组和三元组,这恰好是中文。乍一看,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 个答案:

答案 0 :(得分: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字符串的长度(f.x。“<U+6C14><U+6C14>”)。

如果您对有关stringdist包的更多详细信息感兴趣,我建议使用以下文字:http://www.joyofdata.de/blog/comparison-of-string-distance-algorithms;)