web-dev-qa-db-ja.com

Rでテキスト言語を検出する

Rにはツイートのリストがあり、英語のツイートのみを保持したいと考えています。

文字列の言語を特定する簡単な方法を提供するRパッケージを知っている人がいるのではないかと思います。

乾杯、z

30
zoltanctoth

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" 
39
Ben

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)
21
aykutfirat

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)

私の研究では英語の単語リストの使い方がかなり異なるため、実際にはこれを使用していませんが、これでうまくいくと思います。

14
Tyler Rinker

以前の回答の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の独自の検出システムを信頼できます。

13
giocomai

tl; drcld2ははるかに速い(cld3 x 22textcat x 118 =、手作りのソリューションx 252

正確さについては多くの議論がありましたが、ツイートについては理解できます。しかし、速度はどうですか?

cld2cld3textcatのベンチマークは次のとおりです。

私が書いたいくつかの素朴な関数も入れました。これは、テキスト内のストップワードの出現をカウントします(tm::stopwordsを使用)。

長いテキストの場合、高度なアルゴリズムは必要ない可能性があり、多くの言語のテストは有害になる可能性があると考えました。結局、私のアプローチは最も遅くなります(おそらく、パッケージ化されたアプローチがCでループしているためです)。

同じ考えを持つ人たちに時間を割けるように、ここに置いておきます。 Tyler RinkerEnglishinatorソリューションも遅くなると思います(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の不正確さに関する注意

cld2cld3の正確さについてコメントすることはできません(@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ロイター」

5

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サービスを介してリモート言語検出器を使用することを検討することをお勧めします。

3
Laurynas

franc 」と呼ばれるかなりうまく機能するRパッケージもあります。他のものより遅いのですが、cld2や特にcld3よりも私はそれでより良い経験をしました。

2
Daniel Bendel