Détecter le langage de texte en R
en R j'ai une liste de tweets et je voudrais garder seulement ceux qui sont en anglais.
je me demandais si l'un de vous connais un paquet R qui fournit un moyen simple d'identifier la langue d'une chaîne.
Cheers, z
6 réponses
textcat
colis n'a cette. Il peut détecter 74 'langues' (plus correctement, combinaisons langue/encodage), plus avec d'autres extensions. Détails et exemples sont dans cet article disponible gratuitement:
Hornik, K., Mair, P., Rauch, J., Geiger, W., Buchta, C., & Feinerer, I. Le textcat Paquet de n-Grammes en Fonction de Catégorisation de Texte dans R. Journal d'un Logiciel Statistique, 52, 1-17.
Voici le résumé:
Identifier la langue utilisée sera généralement la première étape dans la plupart des tâches de traitement du langage naturel. Parmi la grande variété de langues les méthodes d'identification discutées dans la littérature, celles qui emploient le Cavnar et Trenkle (1994) approche de la catégorisation de texte basé sur personnage n-gramme fréquences ont été particulièrement réussies. Ce l'article présente le paquet d'extension R textcat pour le texte basé sur n-gramme la catégorisation qui met en œuvre à la fois le Cavnar et Approche de Trenkle ainsi qu'une approche n-gram réduite conçue pour supprimer les redondances de l'approche originale. Un corpus multilingue obtenu à partir du Wikipedia pages disponibles sur une sélection de sujets est utilisé pour illustrer la fonctionnalité du paquet et la performance du fourni des méthodes d'identification de la langue.
Et voici l'un de leurs exemples:
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"
Try http://cran.r-project.org/web/packages/cldr/ ce qui amène la détection de langage de 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)
une approche en R serait de conserver un fichier texte de mots anglais. J'ai plusieurs de ces inlcding l'un de http://www.sil.org/linguistics/wordlists/english/. Après la recherche .fichier txt vous pouvez utiliser ce fichier pour comparer chaque tweet. Quelque chose comme:
lapply(tweets, function(x) EnlishWordComparisonList %in% x)
vous voudriez avoir un certain pourcentage de seuil à couper pour déterminer si c'est l'anglais (j'ai choisi arbitrairement .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)
Je ne l'ai pas réellement utilisé parce que j'utilise le La liste de mots anglais est très différente dans ma recherche, mais je pense que cela pourrait fonctionner.
cldr
paquet dans une réponse précédente n'est plus disponible sur CRAN et peut être difficile à installer. Cependant, de Google (Chrome) cld
les bibliothèques sont maintenant disponibles en R via d'autres paquets dédiés,cld2
et cld3
.
après avoir testé quelques milliers de tweets dans plusieurs langues européennes, je peux dire que parmi les options disponibles,textcat
est de loin la moins fiable. textcat
je reçois aussi très souvent des tweets mal détectés comme "middle_frisian", "romanche", "sanskrit", ou d'autres inhabituel langues. Il peut être relativement bon avec d'autres types de textes, mais je pense textcat
est assez mauvais pour les tweets.
cld2
semble être en général toujours mieux que cld3
. Si vous voulez un moyen sûr d'inclure seulement des tweets en anglais, vous pouvez toujours exécuter les deux cld2
et cld3
et ne conservez que les tweets qui sont reconnus comme anglais par les deux.
voici un exemple basé sur une recherche sur Twitter les offres sont disponibles en plusieurs langues, mais toujours avec des tweets en anglais.
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")
enfin, je devrais peut-être ajouter l'évidence si cette question est spécifiquement liée aux tweets: Twitter fournit via L'API sa propre détection de langage pour les tweets, et il semble être assez précis (moins pour les tweets très courts). Donc, si vous exécutez rtweet::search_tweets(q = "punk")
, vous verrez que les données résultantes.le cadre comprend une colonne" lang". Si vous obtenez vos tweets via API, alors vous peut probablement faire confiance au propre système de détection de Twitter plus que les solutions alternatives suggérées ci-dessus (qui restent valables pour d'autres textes).
tl;dr:
cld2
est de loin le plus rapide (cld3
x 22,textcat
x 118, solution artisanale x252)
il y a eu beaucoup de discussions sur l'exactitude ici, ce qui est compréhensible pour les tweets. Mais qu'en vitesse ?
voici un benchmark de cld2
, cld3
et textcat
.
j'ai aussi ajouté une fonction naïve que j'ai écrite, c'est compter les occurences de les mots vides dans le texte (utilise tm::stopwords
).
j'ai pensé que pour les textes longs, je n'aurais peut-être pas besoin d'un algorithme sophistiqué, et tester de nombreuses langues pourrait être préjudiciable. En fin de Compte, mon approche finit par être la plus lente (très probablement parce que les approches empaquetées sont en boucle dans C
.
je le laisse ici pour que je puisse consacrer du temps à ceux qui auraient la même idée. J'attends l' Englishinator
solution de Tyler Rinker
serait lent (en test pour une seule langue, mais beaucoup plus de mots à tester et de code similaire).
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))))
)
}
référence
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
Remarque:textcat
's imprécision
je ne peux pas commenter sur la précision de cld2
et cld3
(@giocomai a réclamé cld2
était mieux dans sa réponse), mais je confirme que textcat
semble très peu fiable (plusieurs fois sur cette page). Tous les textes ont été classés correctement par toutes les méthodes ci-dessus sauf celle-ci classée comme En espagnol, par textcat
:
Je ne suis pas sûr pour R, mais il y a plusieurs bibliothèques pour d'autres langues. Vous pouvez trouver quelques-uns d'entre eux recueillis ici:
http://www.detectlanguage.com/
Aussi, un récent projet intéressant:
http://blog.mikemccandless.com/2011/10/language-detection-with-googles-compact.html
en utilisant cette bibliothèque les langues de la carte était produit:
http://www.flickr.com/photos/walkingsf/6277163176/in/photostream
si vous ne trouvez pas de bibliothèque pour R, je vous conseille d'utiliser le détecteur de langage à distance via webservice.