Подтвердить что ты не робот

Обнаружить текстовый язык в R

В R у меня есть список твитов, и я хотел бы оставить только те, которые находятся на английском языке.

Мне интересно, знает ли кто-нибудь из R-пакета, который предоставляет простой способ идентифицировать язык строки.

Cheers, г

4b9b3361

Ответ 1

Пакет 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" 

Ответ 2

Попробуйте 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)

Ответ 3

Подход в 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)

Я на самом деле не использовал это, потому что я использую английский список слов по-разному в своих исследованиях, но думаю, что это сработает.

Ответ 4

Пакет 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 больше, чем предлагаемые выше альтернативные решения (которые остаются в силе для других текстов).

Ответ 5

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 "

Ответ 6

Я не уверен в 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.

Ответ 7

Существует также довольно хорошо работающий R-пакет, который называется " franc ". Хотя, это медленнее, чем другие, у меня был лучший опыт с ним, чем с cld2 и особенно cld3.