【问题标题】:How to change language of termDocumentmatrix in R text-mining?如何在 R 文本挖掘中更改 termDocumentmatrix 的语言?
【发布时间】:2019-12-03 07:03:41
【问题描述】:

我需要在 termDocumentmatrix 的功能中将语言更改为土耳其语。你能帮我吗?

此代码有效。我得到了我想要的土耳其语词干、停用词等结果。

dat<-"BirGün, Türkiye'de günlük olarak yayımlanan ulusal bir gazete.
Gazetenin yazı işleri müdürü Berkant Gültekin, yayın danışmanı Barış İnce, 
sorumlu müdürü Cansever Uğur ve haber koordinatörü İbrahim Varlı'dır. Yayın 
hayatına 14 Nisan 2004'te başlayan gazetenin sahibi Birgün Yayıncılık ve İletişim Ticaret AŞ'd"

dat%>% 
  tokens(remove_punct = TRUE, remove_numbers = TRUE, remove_symbols = TRUE)%>%
  tokens_remove(stopwords("tr", source = "stopwords-iso")) %>%
  tokens_wordstem(language = "turkish") %>%
  tokens_tolower() 

Result:

[1] "birg"        "türkiye'"    "günlük"      "yayımlana"   "ulusal"      "gaze"        "gazete"      "yaz"         "iş"         
[10] "müdür"       "berkant"     "gültek"      "yay"         "danışma"     "barış"       "ince"        "sorumlu"     "müdür"      
[19] "cansever"    "uğur"        "haber"       "koordinatör" "ibrah"       "varlı'"      "yay"         "hayat"       "nisa"       
[28] "te"          "başlaya"     "gazete"      "sahip"       "birgi"       "yayıncılık"  "iletiş"      "ticaret"     "aş'd"       

但是,我没有将这些过程整合到术语文档矩阵中,我尝试挖掘 pdf 文件

library(pdftools)
library(tm)
library(SnowballC)
library(dplyr)
library(stringr)
library(tidytext)
library(quanteda)

这部分是在工作区读取pdf文件

files <- list.files(pattern = "pdf$")
file<-as.character(files)
opinions <- lapply(files, pdf_text)
length(opinions)
lapply(opinions, length) 

创建语料库

corp <- Corpus(URISource(files),
               readerControl = list(reader = readPDF))

在这部分,"language="turkish" 不起作用,它仍然使用英语作为基础语言

opinions.tdm <- TermDocumentMatrix(corp, 
                                   control = 
                                     list(language="turkish",
                                          stopwords = TRUE,
                                          removePunctuation = TRUE,
                                          tolower = TRUE,
                                          stemming = TRUE,
                                          removeNumbers = TRUE,
                                          bounds = list(global = c(1, Inf)))) 

inspect(opinions.tdm[1:10,]) 

opinions.tdm <- TermDocumentMatrix(corp, 
                                   control = 
                                     list(language="turkish",
                                          stopwords = TRUE,
                                          tolower = TRUE,
                                          stemming = TRUE,
                                          removePunctuation=TRUE,
                                          removeNumbers = TRUE,
                                          bounds = list(global = c(1, Inf))))    

findFreqTerms(opinions.tdm, lowfreq = 100, highfreq = Inf)

ft <- findFreqTerms(opinions.tdm, lowfreq = 100, highfreq = Inf)
as.matrix(opinions.tdm[ft,]) 

ft.tdm <- as.matrix(opinions.tdm[ft,])
sort(apply(ft.tdm, 1, sum), decreasing = TRUE)
a<-sort(apply(ft.tdm, 1, sum), decreasing = TRUE)
a<-as.data.frame(a)
a$word<-rownames(a)
aa<-a %>%  filter(a > 200) %>%
  mutate(word = reorder(word, a))

【问题讨论】:

  • TermDocumentMatrix控制选项中的语言设置不支持土耳其语。如果 quanteda 能够满足您的需求,您为什么还要尝试使用 tm?要阅读 pdf,您可以使用 readtext 包,它由与 quanteda 相同的开发人员开发,并用它来做所有事情。
  • 感谢您的评论。我是文本挖掘的新手。我必须将语料库转换为 termdocumentmatrix 才能使用随机森林算法。我可以使用 readtext 和 quanteda 包执行这些步骤吗?

标签: r nlp text-mining


【解决方案1】:

基本上,以下内容将带您完成 quanteda。您可能会添加一些行以进行额外的文本清理。 quanteda(和下面的 ranger)的优点是它们自动并行运行。使用 quanteda,您可以使用 quanteda_options(threads = x) 在 x 核上运行。默认为 2。

library(readtext)
library(quanteda)
library(stopwords)

files <- list.files(pattern = "pdf$")

# use option encoding = "UTF-8" if you encounter encoding issues
dat <- readtext(files)

my_dfm <- dat %>% 
  corpus() %>% 
  tokens(remove_punct = TRUE, remove_numbers = TRUE, remove_symbols = TRUE) %>%
  tokens_tolower() %>%  
  tokens_remove(stopwords("tr", source = "stopwords-iso")) %>%
  tokens_wordstem(language = "turkish") %>% 
  dfm()

接下来,您可以使用 quanteda 中的 convert 函数将 dfm 转换为您需要的任何内容,作为 randomForest 的输入。阅读转换功能的帮助。请注意,quanteda 本身已经包含朴素贝叶斯。但是给你一个随机森林的例子,用 ranger 包来提高速度。

# transpose the document term matrix into a term document matrix. 
x <- t(convert(my_dfm, to = "matrix")) 
# transform into data.frame. 
my_df <- data.frame(features = rownames(x), x, stringsAsFactors = FALSE) 

library(ranger)
ranger(features ~ ., data = my_df)

Ranger result

Call:
 ranger(features ~ ., data = my_df) 

Type:                             Classification 
Number of trees:                  500 
Sample size:                      2547 
Number of independent variables:  6 
Mtry:                             2 
Target node size:                 1 
Variable importance mode:         none 
Splitrule:                        gini 
OOB prediction error:             100.00 % 

【讨论】:

  • 感谢 phiver。我使用了游侠包。但现在,我有新的问题。在游侠结果中:样本量 1536,自变量数:14427,OOB 预测误差:37.17 %,Mtry:120。所以,第一个问题是:结果有问题吗?第二个是:我如何将这个结果整合到样本中?也就是说,我想用这个结果对新文本进行分类。有大量的客户文本和三个主要集群“建议”、“投诉”和“需求”。每当有新票出现时,我都想对结果进行聚类。我该怎么做?
  • 对于您描述的用例,主题模型可能是更好的解决方案。查看 topicmodels 包了解更多信息。
猜你喜欢
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2012-05-01
  • 2018-05-04
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多