检测R中的文本语言

时间:2011-11-10 11:11:14

标签: r text-mining

在R中我有一个推文列表,我想只保留那些英文版。

我想知道你是否知道一个R包提供了一种识别字符串语言的简单方法。

干杯, ž

7 个答案:

答案 0 :(得分:34)

textcat包执行此操作。它可以检测74种语言(更恰当地说,语言/编码组合),更多其他扩展。详细信息和示例在此免费文章中:

Hornik,K.,Mair,P.,Rauch,J.,Geiger,W.,Buchta,C。,& Feinerer,I。The textcat Package for n-Gram Based Text Categorization,R。Journal of Statistical Software,52,1-17。

这是摘要:

  

识别所使用的语言通常是大多数人的第一步   自然语言处理任务。各种各样的语言   文献中讨论的识别方法,采用的方法   Cavnar和Trenkle(1994)基于的文本分类方法   字符n-gram频率特别成功。这个   本文介绍了基于n-gram文本的R扩展包textcat   实现Cavnar和Trenkle方法的分类   以及旨在消除冗余的简化n-gram方法   最初的方法。从中获得的多语种语料库   维基百科页面可用于选择主题   说明了包的功能和性能   提供了语言识别方法。

这是他们的一个例子:

library("textcat")
textcat(c(
  "This is an English sentence.",
  "Das ist ein deutscher Satz.",
  "Esta es una frase en espa~nol."))
[1] "english" "german" "spanish" 

答案 1 :(得分:20)

尝试使用谷歌浏览器语言检测功能的http://cran.r-project.org/web/packages/cldr/到<。

#install from archive
url <- "http://cran.us.r-project.org/src/contrib/Archive/cldr/cldr_1.1.0.tar.gz"
pkgFile<-"cldr_1.1.0.tar.gz"
download.file(url = url, destfile = pkgFile)
install.packages(pkgs=pkgFile, type="source", repos=NULL)
unlink(pkgFile)
# or devtools::install_version("cldr",version="1.1.0")

#usage
library(cldr)
demo(cldr)

答案 2 :(得分:13)

R中的方法是保留英文单词的文本文件。我有几个来自http://www.sil.org/linguistics/wordlists/english/的一个。在获取.txt文件后,您可以使用此文件来匹配每条推文。类似的东西:

lapply(tweets, function(x) EnlishWordComparisonList %in% x)

你想要有一些阈值百分比来切断以确定它是否是英语(我随意选择了.06)。

EnglishWordComparisonList<-as.vector(source(path to the list you downloaded above))

Englishinator<-function(tweet, threshold = .06) {
    TWTS <- which((EnlishWordComparisonList %in% tweet)/length(tweet) > threshold)
    tweet[TWTS]
    #or tweet[TWTS,] if the original tweets is a data frame
}

lapply(tweets, Englishinator)

我还没有真正使用过这个,因为我在研究中使用英文单词列表的方式有所不同,但我认为这样可行。

答案 3 :(得分:11)

以前答案中的cldr包在CRAN上不再可用,可能很难安装。但是,Google的(Chromium)cld库现在可通过其他专用软件包cld2cld3在R中使用。

在用多种欧洲语言测试了数千条推文之后,我可以说,在可用选项中,textcat是迄今为止最不可靠的。使用textcat我也经常错误地将推文发现为“middle_frisian”,“rumantsch”,“sanskrit”或其他不寻常的语言。对于其他类型的文本可能相对较好,但我认为textcat对于推文非常糟糕。

cld2似乎总体上仍优于cld3。如果您想要一种安全的方式只包含英文推文,您仍然可以同时运行cld2cld3,并且只保留两者都被识别为英文的推文。

这是一个基于Twitter搜索的示例,它通常提供许多不同语言的结果,但总是包含一些英文推文。

if (!require("pacman")) install.packages("pacman") # for package manangement
pacman::p_load("tidyverse") 
pacman::p_load("textcat")
pacman::p_load("cld2")
pacman::p_load("cld3")
pacman::p_load("rtweet")

punk <- rtweet::search_tweets(q = "punk") %>% mutate(textcat = textcat(x = text), cld2 = cld2::detect_language(text = text, plain_text = FALSE), cld3 = cld3::detect_language(text = text)) %>% select(text, textcat, cld2, cld3)
View(punk)

# Only English tweets
punk %>% filter(cld2 == "en" & cld3 == "en")

最后,如果这个问题与推文特别相关,我应该添加明显的内容:Twitter通过API为推文提供了自己的语言检测,而且它似乎非常准确(可以理解的是,推文非常短)。因此,如果您运行rtweet::search_tweets(q = "punk"),您将看到生成的data.frame包含“lang”列。如果您通过API获取推文,那么您可能更信任Twitter自己的检测系统,而不是上面提出的替代解决方案(对其他文本仍然有效)。

答案 4 :(得分:4)

  

tl; dr cld2是迄今为止最快的cld3 x 22 textcat x 118 ,手工制作的解决方案x 252

这里有很多关于准确性的讨论,这对推文来说是可以理解的。但速度呢?

以下是cld2cld3textcat的基准。

我还提到了我写的一些天真的函数,它正在计算文本中出现的停用词(使用tm::stopwords)。

我认为对于长文本,我可能不需要复杂的算法,并且测试多种语言可能是有害的。最后,我的方法最慢是最慢的(很可能是因为打包的方法在C中循环。

我把它留在这里,所以我可以腾出时间给那些有同样想法的人。我希望Englishinator的{​​{1}}解决方案也会很慢(只测试一种语言,但需要更多的单词来测试和类似的代码)。

Tyler Rinker

基准

detect_from_sw <- function(text,candidates){
  sapply(strsplit(text,'[ [:punct:]]'),function(y)
    names(which.max(sapply(candidates,function(x) sum(tm::stopwords(x) %in% y))))
  )
}

关于data(reuters,package = "kernlab") # a corpus of articles in english length(reuters) # [1] 40 sapply(reuters,nchar) # [1] 1311 800 511 2350 343 388 3705 604 254 239 632 607 867 240 # [15] 234 172 538 887 2500 1030 538 2681 338 402 563 2825 2800 947 # [29] 2156 2103 2283 604 632 602 642 892 1187 472 1829 367 text <- unlist(reuters) microbenchmark::microbenchmark( textcat = textcat::textcat(text), cld2 = cld2::detect_language(text), cld3 = cld3::detect_language(text), detect_from_sw = detect_from_sw(text,c("english","french","german")), times=100) # Unit: milliseconds # expr min lq mean median uq max neval # textcat 212.37624 222.428824 230.73971 227.248649 232.488500 410.576901 100 # cld2 1.67860 1.824697 1.96115 1.955098 2.034787 2.715161 100 # cld3 42.76642 43.505048 44.07407 43.967939 44.579490 46.604164 100 # detect_from_sw 439.76812 444.873041 494.47524 450.551485 470.322047 2414.874973 100 不准确的说明

我无法对textcatcld2的准确性发表评论(@giocomai声称cld3在答案中表现更好),但我确认cld2似乎非常不可靠(在本页的几个地方提到)。所有文本均按上述所有方法正确分类,但textcat

将其归类为西班牙语
  1987年1月阿根廷原油产量为10.8%   1986年1月,Yacimientos Petroliferos Fiscales发现了1232万桶,从13.81 \ nmln桶中流出。 \ n 1987年1月自然   天然气产量总计11.5亿立方米,高出3.6%   1986年1月生产了11.1亿立方米,Yacimientos Petroliferos Fiscales补充道。 \ n路透社“

答案 5 :(得分:2)

我不确定R,但是其他语言有几个库。你可以在这里找到一些收集的内容:

http://www.detectlanguage.com/

最近一个有趣的项目:

http://blog.mikemccandless.com/2011/10/language-detection-with-googles-compact.html

使用此库制作了Twitter语言地图:

http://www.flickr.com/photos/walkingsf/6277163176/in/photostream

如果你找不到R的库,我建议考虑通过webservice使用远程语言检测器。

答案 6 :(得分:1)

还有一个运行良好的R软件包,名为“ franc”。虽然,它比其他的慢,但我对它的体验比对cld2尤其是对cld3的体验要好。