为什么 tf-idf 会截断单词?

Why tf-idf truncates words?

我有一个数据框 x 是:

> str(x)
'data.frame':   117654 obs. of  2 variables:
$ text  : chr  "more about " ...
$ doc_id: chr  "Text 1" "Text 2" "Text 3" "Text 4" ...

我不能在这里报告,dput,因为它太大了。我正在尝试估计 TF-IDF 并编写了代码:

library(dplyr)
library(janeaustenr)
library(tidytext)
book_words <- x %>%
  mutate(text = as.character(text)) %>% 
  unnest_tokens(output = word, input = text) %>%
  count(doc_id, word, sort = TRUE)

book_words <- book_words %>%
  bind_tf_idf(term = word, document = doc_id, n)

book_words<-book_words[order(book_words$tf_idf,decreasing=FALSE),]
book_words = book_words[!duplicated(book_words$word),]

无论如何,我注意到有些词似乎被 运行归类在 book_words 中。例如:

             doc_id          word n  tf      idf    tf_idf
 792727  Text 33268     disposabl 1 1.0 11.67321 11.673214

我确定这是一个 t运行 的术语,因为如果我 运行:

x[grepl("^disposabl$",x$text),]

我没有获得任何行。

你遇到过这种情况吗?

从您的输出来看,名称中似乎有前导空白-space。如果只是 "dispoabl" 没有 leading/trailing 空格,我希望

            doc_id      word n tf      idf   tf_idf
 792727 Text 33268 disposabl 1  1 11.67321 11.67321
 ###              ^         ^   one space each

但是你的输出显示

             doc_id          word n  tf      idf    tf_idf
 792727  Text 33268     disposabl 1 1.0 11.67321 11.673214
                    ^^^^  four extra blanks

这意味着您的 "^dispoabl$" 过于严格。尝试过滤(此处):

x[grepl("disposabl$",x$text),]

删除前导 ^,因此允许 d 之前的内容。备选方案:

  • "\bdisposabl$" 添加了一个单词边界,因此 "adisposabl" 不会匹配,但 "a disposabl" 仍会匹配;
  • "^\s*disposabl$" 要求前导部分为空白-space;
  • trim 空白 space 和 x[grepl("^disposabl$",trimws(x$text))],您的原始模式将在此处起作用。