Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中检测文本语言_R_Text Mining - Fatal编程技术网

在R中检测文本语言

在R中检测文本语言,r,text-mining,R,Text Mining,我有一个tweet列表,我只想保留那些用英语写的tweet 我怎样才能做到这一点呢?我不太清楚R,但是有几个其他语言的库。你可以在这里找到一些收集到的: 最近还有一个有趣的项目: 使用此库生成了Twitter语言地图: 如果你找不到R的库,我建议通过WebService考虑使用远程语言检测器。 < P>一种方法是保留一个英文单词的文本文件。我有几个,其中包括一个。在找到.txt文件后,您可以使用该文件来匹配每个tweet。比如: lapply(tweets, function(x) Eng

我有一个tweet列表,我只想保留那些用英语写的tweet


我怎样才能做到这一点呢?

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

最近还有一个有趣的项目:

使用此库生成了Twitter语言地图:


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

< P>一种方法是保留一个英文单词的文本文件。我有几个,其中包括一个。在找到.txt文件后,您可以使用该文件来匹配每个tweet。比如:

lapply(tweets, function(x) EnglishWordComparisonList %in% x)
您可能需要截断一些阈值百分比,以确定它是否为英语(我随意选择了.06)

EnglishWordComparisonList试试谷歌浏览器的语言检测功能

#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)
#从存档安装
url这个包就是这样做的。它可以检测74种“语言”(更恰当地说,是语言/编码组合),更多的是使用其他扩展。详细信息和示例见本免费文章:

Hornik,K.,Mair,p.,Rauch,J.,Geiger,W.,Buchta,C.,和Feineer,I.在R.统计软件杂志,52,1-17中

以下是摘要:

识别所使用的语言通常是most的第一步 自然语言处理任务。在各种各样的语言中 文献中讨论的识别方法,采用 Cavnar和Trenkle(1994)提出了一种基于 字符n-gram频率特别成功。这 本文介绍了基于n-gram文本的R扩展包textcat 实现Cavnar和Trenkle方法的分类 以及设计用于消除冗余的简化n-gram方法 改变了最初的方法。从数据库中获取的多语种语料库 Wikipedia页面上的一系列主题用于 说明软件包的功能和 提供了语言识别方法

下面是他们的一个例子:

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" 

先前答案中的
cldr
软件包在CRAN上不再可用,可能难以安装。然而,谷歌(Chromium's)的
cld
库现在可以通过其他专用软件包
cld2
cld3
在R中获得

在用多种欧洲语言测试了数千条tweet后,我可以说,在可用的选项中,
textcat
是最不可靠的。通过
textcat
我也经常收到被错误地检测为“中弗里斯语”、“罗马尼亚语”、“梵语”或其他不寻常语言的推文。与其他类型的文本相比,它可能相对较好,但我认为
textcat
对于tweet来说非常糟糕

cld2
总体上似乎仍优于
cld3
。如果您希望以安全的方式仅包含英语tweet,您仍然可以同时运行
cld2
cld3
,并仅保留被两者识别为英语的tweet

下面是一个基于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")
if(!require(“pacman”))安装包(“pacman”)进行包管理
pacman::p_载荷(“tidyverse”)
pacman::p_加载(“文本猫”)
pacman::p_载荷(“cld2”)
pacman::p_载荷(“cld3”)
pacman::p_装载(“rtweet”)
朋克%mutate(textcat=textcat(x=text),cld2=cld2::detect\u language(text=text,plain\u text=FALSE),cld3=cld3::detect\u language(text=text))%%>%select(text,textcat,cld2,cld3)
视图(朋克)
#只有英语推特
朋克%>%过滤器(cld2==“en”和cld3==“en”)
最后,如果这个问题与tweet特别相关,我或许应该补充一个显而易见的问题:Twitter通过API提供了自己的tweet语言检测,而且它似乎非常准确(可以理解,对于非常短的tweet,情况就不那么准确了)。因此,如果运行
rtweet::search_tweets(q=“punk”)
,您将看到结果data.frame包含一个“lang”列。如果您通过API获得推文,那么您可能更信任推文自己的检测系统,而不是上面建议的替代解决方案(对于其他文本仍然有效)

tl;dr
cld2
是目前最快的(
cld3
x22
textcat
x118,手工解决方案x252

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

这里是
cld2
cld3
textcat
的基准

我还加入了一些我编写的简单函数,它计算文本中stopwords的出现次数(使用
tm::stopwords

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

我把它放在这里,这样我就可以腾出时间给那些有同样想法的人。我希望
Tyler Rinker
英格兰人解决方案也会很慢(只测试一种语言,但要测试更多的单词和类似的代码)


detect\u from\u sw还有一个名为“”的运行良好的R软件包。尽管它比其他软件包运行得慢,但与cld2相比,尤其是cld3,我对它有更好的体验。

谢谢@Laurynas!我一直在等待一个针对R的答案,但您的答案一开始就很好。不过,Google Translate API(因此www.detectlanguage.com)将在2011年12月1日被禁用(谷歌将其转变为付费服务)没有问题:)如果谷歌翻译将被禁用,你可以使用detectlanguage.com上的Web服务。我今天发布了它。耶,th
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")
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