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

23
demandé sur zoltanctoth 2011-11-10 15:11:14

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" 
30
répondu Ben 2013-05-30 04:15:57

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)
19
répondu aykutfirat 2015-04-01 19:51:22

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.

13
répondu Tyler Rinker 2016-11-22 18:05:31

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).

8
répondu giocomai 2018-02-15 13:17:21

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:

3
répondu Moody_Mudskipper 2018-02-14 15:38:25

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.

2
répondu Laurynas 2011-11-10 11:29:38