检测R中的文本语言

zol*_*oth 30 r text-mining

在RI有一个推文列表,我想只保留那些英文.

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

干杯,z

Ben*_*Ben 40

textcat软件包做到这一点.它可以检测74种语言(更恰当地说,语言/编码组合),更多其他扩展.详细信息和示例在此免费文章中:

Hornik,K.,Mair,P.,Rauch,J.,Geiger,W.,Buchta,C.,&Feinerer,I.在R. Journal of Statistical Software,52中,基于n-Gram的文本分类的textcat Package,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" 
Run Code Online (Sandbox Code Playgroud)

  • “ textcat()”返回了许多错误分类:我只是在800篇学术论文摘要上运行了该论文,这些论文都是德语或英语。不过,“ textcat”将3分类为拉丁语,3分类为法语(?!),2分类为加泰罗尼亚语(?!?!)。@aykutfirat提出的`cldr`-package确实在所有文本中都受到关注,甚至提出了第二和第三种选择。 (2认同)
  • 对于一个看起来既快速又肮脏的方法(ngram匹配),我想说一个不错的错误率 (2认同)

ayk*_*rat 21

试试http://cran.r-project.org/web/packages/cldr/,它将谷歌Chrome的语言检测带到了R.

#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)
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ker 14

R中的方法是保留英文单词的文本文件.我从http://www.sil.org/linguistics/wordlists/english/获得了其中一些.在获取.txt文件后,您可以使用此文件来匹配每条推文.就像是:

lapply(tweets, function(x) EnglishWordComparisonList %in% x)
Run Code Online (Sandbox Code Playgroud)

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

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

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

lapply(tweets, Englishinator)
Run Code Online (Sandbox Code Playgroud)

我实际上并没有使用过这个,因为我在研究中使用的英文单词列表有很大的不同,但我认为这样可行.

  • 是的,您决定了可接受的阈值 (2认同)

gio*_*mai 13

cldr之前的答案中的软件包在CRAN上不再可用,并且可能难以安装.然而,谷歌的(Chromium的)cld库是通过其他专用包中的R现已有售,cld2cld3.

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

cld2似乎总的来说仍然比cld3.如果你想有一个安全的方法包括只用英文微博,你还可以同时运行cld2,并cld3只保留由双方认可的英语鸣叫.

这是一个基于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")
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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


Moo*_*per 5

tl; drcld2是迄今为止最快的(cld3x 22textcatx 118,手工溶液x 252

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

下面是一个标杆cld2cld3textcat

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

我认为对于长篇文章,我可能不需要复杂的算法,而对多种语言进行测试可能会有害。最后,我的方法最终变得最慢(最有可能是因为打包的方法正在循环中C

我把它留在这里,这样我就可以把时间留给那些有相同想法的人。我预计的Englishinator解决方案也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))))
  )
}
Run Code Online (Sandbox Code Playgroud)

基准

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
Run Code Online (Sandbox Code Playgroud)

请注意有关textcat的不准确性

我无法评论cld2vs 的准确性cld3(@giocomai声称cld2在他的回答中更好),但我确认这textcat似乎非常不可靠(在此页的多个位置都有提及)。所有文本均已通过上述所有方法正确分类,但以下方式将其归为西班牙语textcat

Yacimientos Petroliferos Fiscales说:“阿根廷原油产量从1986年1月的13.81 \ nmln桶下降到1987年1月的10.8 pct。\ n 1987年1月天然气的总产量为11.5亿立方米,比上年增加3.6 pct。 Yacimientos Petroliferos Fiscales的产量超过了11.1亿立方米。\ n路透社”