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)
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)
我实际上并没有使用过这个,因为我在研究中使用的英文单词列表有很大的不同,但我认为这样可行.
gio*_*mai 13
cldr之前的答案中的软件包在CRAN上不再可用,并且可能难以安装.然而,谷歌的(Chromium的)cld库是通过其他专用包中的R现已有售,cld2和cld3.
在使用多种欧洲语言的数千条推文进行测试之后,我可以说在可用选项中,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自己的检测系统,而不是上面提出的替代解决方案(对其他文本仍然有效).
tl; dr:
cld2是迄今为止最快的(cld3x 22,textcatx 118,手工溶液x 252)
这里有很多关于准确性的讨论,这对于鸣叫是可以理解的。但是速度呢?
下面是一个标杆cld2,cld3和textcat。
我还写了一些我写的天真的函数,它计算文本中停用词的出现(使用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路透社”
| 归档时间: |
|
| 查看次数: |
18300 次 |
| 最近记录: |