电影《星球大战》中人物名字的语种分类

发布时间: 2016-01-13 阅读数: 1280

赶在去年十二月份放映之前,我和Data Lab的一名同事从维基百科抓取了电影《星球大战》中的人物名字,我们对它有些兴趣。幸运的是,一个波兰人对这个比较熟悉并写了一篇文章放在他们的网站上。我们尝试通过相似性来对《星球大战》中的人物名字进行聚类。我们要选什么方法来对人物名字进行分组呢?处理这类问题的一种方式是采用R中流行的文本分类包textcat。它基于先前的文本标记预料库对新的未见过的文本进行分类。在这个案例里面,我们使用它对之前未见过的文本做语种分类。强烈推荐两篇文章(见参考文献)。下面简单介绍下这个方法的基础。

首先,文本的标记语料被分成字母的n-grams(中文可以参考N-gram的原理、用途和研究)或者是连续的字母组合。例如,单词STAR可以被分成S,T,A,R,ST,TA,AR,STA,TAR和STAR。对于本案例的每种语种,一个n-gram频率分布可以被归为一类。这个文本被分成了n-grams,并得到了频率分布。这里要做的事情是用文本的n-grams跟标记过的语料库做距离度量,并选择最小的距离。所有的这些工作都可以由textcat来完成(见参考文献)。

我们首先要提醒大家的是,我们使用的文本数据非常小。通过人物名字的长度来猜测它的语种,我的预感是这不是一个好的主意。然而,很有趣。最重要的是我们只是根据已有的语料库来检测下语种,想知道textcat包的作者是如何做的见参考文献。我们也没有尝试对每个可能的分类分配相对概率。

注:多亏timvink让我注意到了library(ggrepel)。它对下面第一幅图的重叠标签做了修复。非常棒!这是我一直在找的东西!

加载R包,并读入数据:

library(MASS)
library(textcat)
library(dplyr)
library(ggplot2)
library(ggrepel)
library(pander)

charNames <- read.csv("https://raw.githubusercontent.com/rmnppt/StarWars_textcat/master/Data/star_wars_dataframe.csv", 
                      header = F, as.is = T, sep = "\t", skip = 1)
names(charNames) <- c("name", "desc")

数据加载进来后,快速浏览下textcat包中不同的n-gram特征文件的相似性。

ds <- textcat_xdist(TC_char_profiles)
mds <- isoMDS(ds)

# initial  value 33.975940 
## final  value 33.975940 
## converged
distances <- data.frame(
  lang = rownames(mds$points),
  x = mds$points[,1],
  y = mds$points[,2]
)

ggplot(distances, aes(x = x, y = y)) +
  geom_point(size = 1.5) +
  geom_text_repel(aes(label = lang), 
                  colour = grey(0.6), 
                  segment.color = grey(0.8),
                  segment.size = 0.25)

从这幅图片可以看出哪些语种相互之间是比较难区分的。现在,我们开始做文本分类:

charNames$langCat <- ""
for(i in 1:nrow(charNames)){
  charNames$langCat[i] <- textcat(charNames$name[i])
}

现在,我们来检测下结果。查看下哪些语种是在《星球大战》是最常见的:

counts <- data.frame(table(charNames$langCat))
names(counts)[1] <- "language"
counts$language <- reorder(counts$language, counts$Freq)

ggplot(counts, aes(x = language, y = Freq)) +
  geom_bar(stat = "identity") +
  coord_flip()

查看下人物角色名字为英语或德语的有哪些?

charNames %>% 
  filter(langCat == "english" | langCat == "german") %>%
  select(name, langCat) %>%
  arrange(langCat)

##                                 name langCat
## 1                       Tavion Axmis english
## 2                  Empatojayos Brand english
## 3                       Armand Isard english
## 4                   Karina the Great english
## 5                         Tion Medon english
## 6                  Poggle the Lesser english
## 7                         Darth Sion english
## 8                        Riff Tamson english
## 9             Grand Moff Thistleborn english
## 10              Grand Admiral Thrawn english
## 11                     Ace Tiberious english
## 12                            Tiplee english
## 13                    Admiral Trench english
## 14                          Triclops english
## 15                       Stass Allie  german
## 16                             B4-D4  german
## 17                      Darth Bandon  german
## 18                       Bren Derlin  german
## 19 Orgus Din - voiced by Robert Pine  german
## 20            Grand Moff Vilim Disra  german
## 21              Grand Moff Dunhausen  german
## 22                        Bant Eerin  german
## 23                            EV-9D9  german
## 24                       Davin Felth  german
## 25         Grand Moff Bertroff Hissa  german
## 26                               Ken  german
## 27                        Agen Kolar  german
## 28                        Jaden Korr  german
## 29                General Pong Krell  german
## 30                      Satine Kryze  german
## 31             Warmaster Tsavong Lah  german
## 32                         Beru Lars  german
## 33                         Owen Lars  german
## 34                              MD-5  german
## 35                       Bengel Morr  german
## 36                      Karness Muur  german
## 37                 Grand Moff Muzzer  german
## 38                    Ruwee Naberrie  german
## 39                        Ferus Olin  german
## 40                    Echuu Shen-Jon  german
## 41         Grand Moff Wilhuff Tarkin  german
## 42                    Longo Two-Guns  german
## 43                       Darth Vader  german
## 44                     Darth Vitiate  german
## 45                           Taun We  german
## 46                     Beru Whitesun  german
## 47                            Winter  german

以上代码,抓取维基百科数据的代码等放在github

参考文献:

  1. Cavnar, W.B., Trenkle, J.M., (1994) N-Gram-Based Text Categorization. Proceedings of SDAIR-94, 3rd Annual Symposium on Document Analysis and Information Retrieval http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.53.9367
  2. Hornik, K., Mair, P., Rauch, J., Geiger, W., Buchta, C., & Feinerer, I. (2013). The textcat Package for n-Gram Based Text Categorization in R. Journal of Statistical Software, 52(6), 1 - 17. doi:http://dx.doi.org/10.18637/jss.v052.i06

本文由雪晴数据网负责翻译整理,原文请参考Language categorisation of Star Wars character names作者Roman Popat。转载请注明原文链接http://www.xueqing.tv/cms/article/112

分享到:
热门文章

REmap发布,用R绘制百度迁徙图

2015年07月23日更新 21085次阅读

学习R语言,一篇文章让你从懵圈到入

2016年05月09日更新 14670次阅读

清华大学教授:大数据时代 统计学依

2015年08月07日更新 11291次阅读

在R中填充缺失数据—mice包

2015年12月31日更新 10743次阅读

精通 R plot—第一部分:颜色

2016年01月20日更新 9549次阅读

非统计学专业的人该如何学习 R 语

2015年07月24日更新 8107次阅读
热门课程

R语言初级课程

2015年02月20日发布 3231名学员

R语言高效数据清理工具包dplyr

2015年08月30日发布 1690名学员

R语言数据分析入门

2016年05月10日发布 1566名学员

如何用R做数据预处理

2016年06月03日发布 1160名学员

全栈数据工程师养成攻略

2016年11月08日发布 1019名学员

R语言大规模数据分析实战

2015年12月17日发布 952名学员
登录 注册