Quanteda с topicmodels: удаленные стоп-слова появляются в результатах (китайский)
Мой код:
library(quanteda)
library(topicmodels)
# Some raw text as a vector
postText <- c("普京 称 俄罗斯 未 乌克兰 施压 来自 头 条 新闻", "长期 电脑 前进 食 致癌 环球网 报道 乌克兰 学者 认为 电脑 前进 食 会 引发 癌症 等 病症 电磁 辐射 作用 电脑 旁 水 食物 会 逐渐 变质 有害 物质 累积 尽管 人体 短期 内 会 感到 适 会 渐渐 引发 出 癌症 阿尔茨海默 式 症 帕金森 症 等 兔子", "全 木 手表 乌克兰 木匠 瓦列里·达内维奇 木头 制作 手表 共计 154 手工 零部件 唯一 一个 非 木制 零件 金属 弹簧 驱动 指针 运行 其他 零部件 材料 取自 桦树 苹果树 杏树 坚果树 竹子 黄杨树 愈疮木 非洲 红木 总共 耗时 7 打造 手表 不仅 能够 正常 运行 天 时间 误差 保持 5 分钟 之内 ")
# Create a corpus of the posts
postCorpus <- corpus(postText)
# Make a dfm, removing numbers and punctuation
myDocTermMat <- dfm(postCorpus, stem = FALSE, removeNumbers = TRUE, removeTwitter = TRUE, removePunct = TRUE)
# Estimate a LDA Topic Model
if (require(topicmodels)) {
myLDAfit <- LDA(convert(myDocTermMat, to = "topicmodels"), k = 2)
}
terms(myLDAfit, 11)
Код работает, и я вижу результат. Вот пример вывода:
Topic 1 Topic 2
[1,] "木" "会"
[2,] "手表" "电脑"
[3,] "零" "乌克兰"
[4,] "部件" "前进"
[5,] "运行" "食"
[6,] "乌克兰" "引发"
[7,] "内" "癌症"
[8,] "全" "等"
[9,] "木匠" "症"
[10,] "瓦" "普"
[11,] "列" "京"
Здесь проблема. Все мои сообщения были сегментированы (необходимый этап предварительной обработки для китайского языка) и были удалены стоп-слова. Тем не менее, модель темы возвращает темы, содержащие односимвольные термины остановки, которые уже были удалены. Если я открою необработанные файлы.txt и выполню ctrl-f для заданного односимвольного стоп-слова, результаты не будут возвращены. Но эти термины отображаются в возвращенных разделах кода R, возможно, потому, что отдельные символы встречаются как часть других многосимвольных слов. Например, 就 - предлог, рассматриваемый как стоп-слово, но 成就 означает "успех".
В связи с этим некоторые термины разделены. Например, одно из рассматриваемых мной событий содержит ссылки на президента России Путина ("("). Однако в результатах тематической модели я вижу отдельные записи терминов для "普" и "京", а для "普京" никаких записей нет. (См. Строки 10 и 11 в выходной теме 2 по сравнению с первым словом в необработанном тексте.)
Есть ли здесь дополнительный шаг токенизации?
Редактировать: Изменено, чтобы сделать воспроизводимым. По некоторым причинам это не позволило бы мне отправлять, пока я не удалил свой вступительный абзац.
1 ответ
Вот обходной путь, основанный на использовании более быстрого, но "тупого" токенайзера слова, основанного на пробелах ("\\s"
) расщепление:
# fails
features(dfm(postText, verbose = FALSE))
## [1] "普" "京" "称" "俄罗斯" "未" "乌克兰" "施压" "来自" "头" "条" "新闻"
# works
features(dfm(postText, what = "fasterword", verbose = FALSE))
## [1] "普京" "称" "俄罗斯" "未" "乌克兰" "施压" "来自" "头" "条" "新闻"
Так добавь what = "fasterword"
к dfm()
позвоните, и вы получите это в результате, где Путин ("普京") не раскололся.
terms(myLDAfit, 11)
## Topic 1 Topic 2
## [1,] "会" "手表"
## [2,] "电脑" "零部件"
## [3,] "乌克兰" "运行"
## [4,] "前进" "乌克兰"
## [5,] "食" "全"
## [6,] "引发" "木"
## [7,] "癌症" "木匠"
## [8,] "等" "瓦列里达内维奇"
## [9,] "症" "木头"
## [10,] "普京" "制作"
## [11,] "称" "共计"
Это интересный случай, когда токенайзер Quanteda по умолчанию, построенный на определении определения границ текста в stringi (см. Stri_split_boundaries, не работает в настройках по умолчанию. Это может произойти после экспериментирования с локалью, но в настоящее время это не параметры). которые могут быть переданы quanteda::tokenize()
, который dfm()
звонки.
Пожалуйста, подайте это как проблему на https://github.com/kbenoit/quanteda/issues и я постараюсь найти лучшее решение, используя "умнее" слово tokeniser.