Ответ 1
Некоторые инструменты для NLP доступны здесь:
http://cran.r-project.org/web/views/NaturalLanguageProcessing.html
Задача нетривиальная. Дополнительные подсказки (включая алгоритм, который вы можете реализовать):
Я хочу назначить несколько разных показателей удобочитаемости для текста в R, например, Flesh Kincaid.
Кто-нибудь знает способ отсечения слов на слоги с помощью R? Мне не обязательно нужны сегменты слога, но счет.
так, например:
x <- c('dog', 'cat', 'pony', 'cracker', 'shoe', 'Popsicle')
даст: 1, 1, 2, 2, 1, 3
Каждое число соответствует числу слогов в слове.
Некоторые инструменты для NLP доступны здесь:
http://cran.r-project.org/web/views/NaturalLanguageProcessing.html
Задача нетривиальная. Дополнительные подсказки (включая алгоритм, который вы можете реализовать):
qdap версия 1.1.0 выполняет эту задачу:
library(qdap)
x <- c('dog', 'cat', 'pony', 'cracker', 'shoe', 'Popsicle')
syllable_sum(x)
## [1] 1 1 2 2 1 3
gsk3 верен: если вы хотите правильное решение, оно нетривиально.
Например, вы должны следить за такими странными вещами, как тихий e в конце слова (например, панель), или знать, когда он не молчит, как в финале.
Однако, если вы просто хотите быстрое и грязное приближение, это сделает это:
> nchar( gsub( "[^X]", "", gsub( "[aeiouy]+", "X", tolower( x ))))
[1] 1 1 2 2 1 3
Чтобы понять, как работают детали, просто отмените вызовы функций извне, начиная с nchar
, а затем gsub
и т.д....... пока выражение не будет иметь для вас смысла.
Но я предполагаю, что, рассматривая борьбу между R-властью и изобилием исключений на английском языке, вы могли бы получить достойный ответ (может быть, 99% прав?) разбор по нормальному тексту без большой работы - простой парсер может получить 90% + право. Если вы хотите немного работать, вы можете иметь дело с тихим e, если хотите.
Все зависит от вашего приложения - достаточно ли это или вам нужно что-то более точное.
Пакет koRpus поможет вам избавиться от immensley, но с ним немного сложно работать.
stopifnot(require(koRpus))
tokens <- tokenize(text, format="obj", lang='en')
flesch.kincaid(tokens)