Как правильно кодировать текстовые файлы UTF-8 для модели R topi c - PullRequest
0 голосов
/ 27 апреля 2020

Подобные проблемы обсуждались на этом форуме (например, здесь и здесь ), но я не нашел ту, которая решает мою проблему, поэтому я прошу прощения за, казалось бы, похожий вопрос .

У меня есть набор .txt файлов с кодировкой UTF-8 (см. Скриншот). Я пытаюсь запустить модель topi c в R, используя пакет tm. Однако, несмотря на использование encoding = "UTF-8" при создании корпуса, у меня возникают очевидные проблемы с кодированием. Например, я получаю масштаб вместо фискальный , в uen c вместо влияния , не все знаки препинания удалены, а некоторые буквы не распознаются (например, кавычки все еще присутствуют в некоторых случаях, например view ” или plan ' или ændring или потерянные кавычки, такие как «и» или zit или лет - таким образом с отметкой da sh, которая должна была быть удалена). Эти термины также отображаются в топи c распределении по терминам. Раньше у меня были некоторые проблемы с кодированием, но я использовал "encoding = "UTF-8" для создания корпуса, используемого для решения проблемы. Кажется, в этот раз это не помогает.

Я на Windows 10 x64, версия R 3.6.0 (2019-04-26), версия пакета 0.7-7 для версии 0.7-7 (все в актуальном состоянии) ). Я был бы очень признателен за любые советы о том, как решить эту проблему.

library(tm)
library(beepr)
library(ggplot2)
library(topicmodels)
library(wordcloud)
library(reshape2)
library(dplyr)
library(tidytext)
library(scales)
library(ggthemes)
library(ggrepel)
library(tidyr)


inputdir<-"c:/txtfiles/"
docs<- VCorpus(DirSource(directory = inputdir, encoding ="UTF-8"))

#Preprocessing
docs <-tm_map(docs,content_transformer(tolower))

removeURL <- function(x) gsub("http[^[:space:]]*", "", x)
docs <- tm_map(docs, content_transformer(removeURL))

toSpace <- content_transformer(function(x, pattern) (gsub(pattern, " ", x)))
docs <- tm_map(docs, toSpace, "/")
docs <- tm_map(docs, toSpace, "-")
docs <- tm_map(docs, toSpace, "\\.")
docs <- tm_map(docs, toSpace, "\\-")


docs <- tm_map(docs, removePunctuation)
docs <- tm_map(docs, removeNumbers)
docs <- tm_map(docs, removeWords, stopwords("english"))
docs <- tm_map(docs, stripWhitespace)
docs <- tm_map(docs,stemDocument)

dtm <- DocumentTermMatrix(docs)
freq <- colSums(as.matrix(dtm))
ord <- order(freq, decreasing=TRUE)
write.csv(freq[ord],file=paste("word_freq.csv"))

#Topic model
  ldaOut <-LDA(dtm,k, method="Gibbs", 
               control=list(nstart=nstart, seed = seed, best=best, 
                            burnin = burnin, iter = iter, thin=thin))

Редактировать: я должен добавить, что в cse оказывается уместным, что текстовые файлы были созданы из PDF-файлов с использованием следующего кода R:

inputdir <-"c:/pdf/"
myfiles <- list.files(path = inputdir, pattern = "pdf",  full.names = TRUE)
lapply(myfiles, function(i) system(paste('"C:/Users/Delt/AppData/Local/Programs/MiKTeX 2.9/miktex/bin/x64/pdftotext.exe"',
                                         paste0('"', i, '"')), wait = FALSE) )

Два образца текстовых файлов можно загрузить здесь .

txt files have UTF encoding

1 Ответ

1 голос
/ 29 апреля 2020

Я нашел обходной путь, который, кажется, корректно работает с 2 примерами файлов, которые вы предоставили. Сначала нужно NFKD (Декомпозиция совместимости) . Это разбивает лигатуру «" »orthographi c на f и i. К счастью, пакет stringi может справиться с этим. Поэтому перед выполнением специальной очистки текста необходимо применить функцию stringi::stri_trans_nfkd. Вы можете сделать это на этапе предварительной обработки сразу после (или до) этапа tolower.

Прочтите документацию по этой функции и ссылки.

library(tm)
docs<- VCorpus(DirSource(directory = inputdir, encoding ="UTF-8"))

#Preprocessing
docs <-tm_map(docs,content_transformer(tolower))

# use stringi to fix all the orthographic ligature issues 
docs <- tm_map(docs, content_transformer(stringi::stri_trans_nfkd))

toSpace <- content_transformer(function(x, pattern) (gsub(pattern, " ", x)))

# add following line as well to remove special quotes. 
# this uses a replace from textclean to replace the weird quotes 
# which later get removed with removePunctuation
docs <- tm_map(docs, content_transformer(textclean::replace_curly_quote))

....
rest of process
.....
...