Rにはツイートのリストがあり、英語のツイートのみを保持したいと考えています。
文字列の言語を特定する簡単な方法を提供するRパッケージを知っている人がいるのではないかと思います。
乾杯、z
textcat
パッケージがこれを行います。 74の「言語」(より正確には、言語/エンコーディングの組み合わせ)を検出できます。詳細と例は、この無料で入手できる記事にあります。
Hornik、K.、Mair、P.、Rauch、J.、Geiger、W.、Buchta、C.、&Feinerer、I. n-Gramベースのテキスト分類のためのtextcatパッケージ R. Journal of Statistical Software、52、1-17。
ここに要約があります:
使用する言語の特定は、通常、ほとんどの自然言語処理タスクの最初のステップです。文献で説明されている多種多様な言語識別方法の中で、Cavnar and Trenkle(1994)の手法を使用して、文字のNグラムの頻度に基づいてテキストを分類する方法が特に成功しています。このホワイトペーパーでは、CavnarとTrenkleのアプローチ、および元のアプローチの冗長性を削除するように設計された削減されたn-gramアプローチの両方を実装する、n-gramベースのテキスト分類のためのR拡張パッケージtextcatを紹介します。選択したトピックで利用可能なWikipediaページから取得した多言語コーパスを使用して、パッケージの機能と提供されている言語識別方法のパフォーマンスを説明します。
そして、これがその例の1つです。
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"
http://cran.r-project.org/web/packages/cldr/ を試してください。これにより、Google 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)
Rでのアプローチは、英語の単語のテキストファイルを保持することです。 http://www.sil.org/linguistics/wordlists/english/ からの1つを含むこれらのいくつかがあります。 .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)
私の研究では英語の単語リストの使い方がかなり異なるため、実際にはこれを使用していませんが、これでうまくいくと思います。
以前の回答のcldr
パッケージはCRANで利用できなくなっており、インストールが難しい場合があります。ただし、Googleの(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")
_
最後に、この質問が特にツイートに関連している場合は、明白なことを追加する必要があります。TwitterはAPIを介してツイートの独自の言語検出を提供し、かなり正確であるようです(非常に短いツイートの場合はそれほどわかりません)。したがって、rtweet::search_tweets(q = "punk")
を実行すると、結果のdata.frameに「lang」列が含まれていることがわかります。 APIを介してツイートを取得する場合、上で提案した代替ソリューション(他のテキストでも有効です)よりも、Twitterの独自の検出システムを信頼できます。
tl; dr:
cld2
ははるかに速い(cld3
x 22、textcat
x 118 =、手作りのソリューションx 252)
正確さについては多くの議論がありましたが、ツイートについては理解できます。しかし、速度はどうですか?
cld2
、cld3
、textcat
のベンチマークは次のとおりです。
私が書いたいくつかの素朴な関数も入れました。これは、テキスト内のストップワードの出現をカウントします(tm::stopwords
を使用)。
長いテキストの場合、高度なアルゴリズムは必要ない可能性があり、多くの言語のテストは有害になる可能性があると考えました。結局、私のアプローチは最も遅くなります(おそらく、パッケージ化されたアプローチがC
でループしているためです)。
同じ考えを持つ人たちに時間を割けるように、ここに置いておきます。 Tyler Rinker
のEnglishinator
ソリューションも遅くなると思います(1つの言語だけをテストしますが、テストする単語はもっと多く、同様のコードを使用します)。
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
textcat
の不正確さに関する注意
cld2
とcld3
の正確さについてコメントすることはできません(@giocomaiはcld2
の方が答えが優れていたと主張しています)が、textcat
は非常に信頼できないようですこのページのいくつかの場所)。すべてのテキストは、textcat
によってスペイン語として分類されたものを除いて、上記のすべての方法によって正しく分類されました。
「アルゼンチンの原油生産量は、\ n1987年1月の10.8パーセント減の12.32百万バレルで、1986年1月の13.81ナノメートルバレルからYacimientos Petroliferos Fiscalesは\ n言った。\ n 1987年1月の天然ガス生産量は11億5000万立方メートル、3.6パーセント高かった11億1,000万立方メートル以上が生産された\ n 1986年1月、Yacimientos Petroliferos Fiscalesが追加されました。\ nロイター」
Rについてはよくわかりませんが、他の言語用のライブラリがいくつかあります。あなたはここで集められたそれらのいくつかを見つけることができます:
http://www.detectlanguage.com/
また、最近の興味深いプロジェクトの1つ:
http://blog.mikemccandless.com/2011/10/language-detection-with-googles-compact.html
このライブラリを使用して、Twitter言語マップが作成されました。
http://www.flickr.com/photos/walkingsf/6277163176/in/photostream
Rのライブラリが見つからない場合は、Webサービスを介してリモート言語検出器を使用することを検討することをお勧めします。
「 franc 」と呼ばれるかなりうまく機能するRパッケージもあります。他のものより遅いのですが、cld2や特にcld3よりも私はそれでより良い経験をしました。