В R у меня есть список твитов, и я хотел бы оставить только те, которые находятся на английском языке.
Мне интересно, знает ли кто-нибудь из R-пакета, который предоставляет простой способ идентифицировать язык строки.
Cheers, г
В R у меня есть список твитов, и я хотел бы оставить только те, которые находятся на английском языке.
Мне интересно, знает ли кто-нибудь из R-пакета, который предоставляет простой способ идентифицировать язык строки.
Cheers, г
Пакет textcat
делает это. Он может обнаруживать 74 'языки' (более правильно, комбинации языка/кодировки), больше с другими расширениями. Подробности и примеры приведены в этой свободно доступной статье:
Hornik, K., Mair, P., Rauch, J., Geiger, W., Buchta, C. и Feinerer, I. Пакет textcat для n-грамм Основанная на тексте категоризации в R. Journal of Statistical Software, 52, 1-17.
Здесь реферат:
Идентификация используемого языка обычно будет первым шагом в большинстве задачи обработки естественного языка. Среди широкого разнообразия языков методы идентификации, обсуждаемые в литературе, те, которые используют подход Cavnar and Trenkle (1994) к категоризации текста на основе характерные частоты n-грамм были особенно успешными. Эта в документе представлен текстовый блок расширения R для текста на основе n-грамм категоризация, которая реализует подход Cavnar и Trenkle а также уменьшенный n-граммовый подход, предназначенный для устранения избыточности первоначального подхода. Многоязычный корпус, полученный из Доступные страницы Википедии по выбору тем используются для иллюстрируют функциональность пакета и производительность при условии использования методов идентификации языка.
И вот один из их примеров:
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 должен заключаться в том, чтобы сохранить текстовый файл с английскими словами. У меня есть несколько из этих inccding из http://www.sil.org/linguistics/wordlists/english/. После поиска файла .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", "санскрит" или другие необычные языки. Это может быть относительно хорошо с другими типами текстов, но я думаю, что 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, handmade solution x 252)
Здесь много дискуссий о точности, что понятно для твитов. Но как насчет скорости?
Вот эталон cld2
, cld3
и textcat
.
Я также добавил некоторую наивную функцию, которую я написал, подсчитывая наличие стоп-слов в тексте (использует tm::stopwords
).
Я думал, что для длинных текстов мне может не понадобиться сложный алгоритм, и тестирование на многих языках может быть вредным. В конечном итоге мой подход заканчивается тем, что он является самым медленным (скорее всего, потому, что упакованные подходы зацикливаются на C
Я оставляю его здесь, поэтому я могу сэкономить время тем, у кого будет такая же идея. Я ожидаю, что решение Englishinator
Tyler Rinker
будет медленным (тестирование только на одном языке, но гораздо больше слов для тестирования и аналогичного кода).
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
vs cld3
(@giocomai утверждал, что cld2
был лучше в его ответе), но я подтверждаю, что textcat
кажется очень ненадежным (в нескольких местах на этой странице). Все тексты были классифицированы правильно всеми вышеперечисленными способами, кроме тех, которые были классифицированы как Spanish по textcat
:
"Добыча нефти в Аргентине в январе 1987 года составила 10,8% в январе 1987 года до 12,32 млн баррелей, с 13,81 тыс. Баррелей в январе 1986 года. В январе 1987 года объем добычи природного газа составил 1,15 млрд. Кубических метров, что на 3,6% выше чем 1,11 миллиарда кубических метров, произведенных \nin января 1986 года, добавлено Yacimientos Petroliferos Fiscales.\n Reuter "
Я не уверен в R, но есть несколько библиотек для других языков. Вы можете найти некоторые из них, собранные здесь:
http://www.detectlanguage.com/
Также один недавний интересный проект:
http://blog.mikemccandless.com/2011/10/language-detection-with-googles-compact.html
С помощью этой библиотеки была создана карта языков Twitter:
http://www.flickr.com/photos/walkingsf/6277163176/in/photostream
Если вы не найдете библиотеку для R, я предлагаю рассмотреть возможность использования дистанционного детектора языка через webservice.
Существует также довольно хорошо работающий R-пакет, который называется " franc ". Хотя, это медленнее, чем другие, у меня был лучший опыт с ним, чем с cld2 и особенно cld3.