tidytext、quanteda 和 tm 返回不同的 tf-idf 分数

2024-03-09

我正在尝试研究 tf-idf 加权语料库(我希望 tf 是按文档划分的比例,而不是简单的计数)。我希望所有经典文本挖掘库都会返回相同的值,但我得到了不同的值。我的代码中是否存在错误(例如,我是否需要转置对象?)或者 tf-idf 计数的默认参数在包之间是否有所不同?

library(tm)
library(tidyverse) 
library(quanteda)
df <- as.data.frame(cbind(doc = c("doc1", "doc2"), text = c("the quick brown fox jumps over the lazy dog", "The quick brown foxy ox jumps over the lazy god")), stringsAsFactors = F)

df.count1 <- df %>% unnest_tokens(word, text) %>% 
  count(doc, word) %>% 
  bind_tf_idf(word, doc, n) %>% 
  select(doc, word, tf_idf) %>% 
  spread(word, tf_idf, fill = 0) 

df.count2 <- df %>% unnest_tokens(word, text) %>% 
  count(doc, word) %>% 
  cast_dtm(document = doc,term = word, value = n, weighting = weightTfIdf) %>% 
  as.matrix() %>% as.data.frame()

df.count3 <- df %>% unnest_tokens(word, text) %>% 
  count(doc, word) %>% 
  cast_dfm(document = doc,term = word, value = n) %>% 
  dfm_tfidf() %>% as.data.frame()

   > df.count1
# A tibble: 2 x 12
  doc   brown    dog    fox   foxy    god jumps  lazy  over     ox quick   the
  <chr> <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>
1 doc1      0 0.0770 0.0770 0      0          0     0     0 0          0     0
2 doc2      0 0      0      0.0693 0.0693     0     0     0 0.0693     0     0

> df.count2
     brown       dog       fox jumps lazy over quick the foxy god  ox
doc1     0 0.1111111 0.1111111     0    0    0     0   0  0.0 0.0 0.0
doc2     0 0.0000000 0.0000000     0    0    0     0   0  0.1 0.1 0.1

> df.count3
     brown     dog     fox jumps lazy over quick the    foxy     god      ox
doc1     0 0.30103 0.30103     0    0    0     0   0 0.00000 0.00000 0.00000
doc2     0 0.00000 0.00000     0    0    0     0   0 0.30103 0.30103 0.30103

您偶然发现了计算术语频率的差异。

标准定义:

TF:术语频率:TF(t) =(术语 t 出现在 a 中的次数 文档)/(文档中的术语总数)。

IDF:逆文档频率:IDF(t) = log(总数量 文档/其中包含术语 t 的文档数量)

TF-IDF 重量是这些量 TF * IDF 的乘积

看起来很简单,但事实并非如此。我们来计算 doc1 中单词“dog”的 tf_idf。

狗的第一个 TF:即 doc 中的 1 个术语 / 9 个术语 = 0.11111

1/9 = 0.1111111

现在狗的 IDF:(2 个文档/1 个术语)的日志。现在有多种可能性,即:log(或自然对数)、log2或log10!

log(2) = 0.6931472
log2(2) = 1
log10(2) = 0.30103

#tf_idf on log:
1/9 * log(2) = 0.07701635

#tf_idf on log2:
1/9 * log2(2)  = 0.11111

#tf_idf on log10:
1/9 * log10(2) = 0.03344778

现在变得有趣了。Tidytext根据日志为您提供正确的权重。tm根据 log2 返回 tf_idf。我预计 Quanteda 的值为 0.03344778,因为它们的基数是 log10。

但是查看 quanteda,它正确返回结果,但使用计数作为默认值而不是比例计数。要获得应有的一切,请尝试以下代码:

df.count3 <- df %>% unnest_tokens(word, text) %>% 
  count(doc, word) %>% 
  cast_dfm(document = doc,term = word, value = n)


dfm_tfidf(df.count3, scheme_tf = "prop", scheme_df = "inverse")
Document-feature matrix of: 2 documents, 11 features (22.7% sparse).
2 x 11 sparse Matrix of class "dfm"
      features
docs   brown        fox        god jumps lazy over quick the      dog     foxy       ox
  doc1     0 0.03344778 0.03344778     0    0    0     0   0 0        0        0       
  doc2     0 0          0              0    0    0     0   0 0.030103 0.030103 0.030103

看起来更好,这是基于 log10 的。

如果你使用quanteda通过调整参数,可以得到tidytext or tm通过改变结果base范围。

# same as tidytext the natural log
dfm_tfidf(df.count3, scheme_tf = "prop", scheme_df = "inverse", base = exp(1))

# same as tm
dfm_tfidf(df.count3, scheme_tf = "prop", scheme_df = "inverse", base = 2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tidytext、quanteda 和 tm 返回不同的 tf-idf 分数 的相关文章

  • svyby比例的置信区间

    是否存在创建置信区间的现有函数 从一个svyby比例对象 在我的例子中 是一个二进制项目的交叉表survey包裹 我经常比较各组之间的比例 如果有一个可以提取置信区间的函数 使用调查函数svyciprop而不是confint 下面的示例显示
  • 如何缩放(标准化)每列内的 ggplot2 stat_bin2d 值(按 X 轴)

    我有一个 ggplot stat bin2d 热图 library ggplot2 value lt rep 1 5 1000 df lt as data frame value df group lt rep 1 7 len 5000 d
  • 删除绘图轴值

    我只是想知道是否有一种方法可以消除 r 图中的轴值 分别是 x 轴或 y 轴 我知道axes false将摆脱整个轴 但我只想摆脱编号 删除 x 轴或 y 轴上的编号 plot 1 10 xaxt n plot 1 10 yaxt n 如果
  • 使用 SP 包中的 SpatialPoints() 转换坐标参考系 (CRS) 以创建空间数据框

    Issue 我有一个形状文件我已将其导入到 R 中 并为正在进行的分析选择了感兴趣的变量 我的最终目标是插值点数据 海豚 ID 获取海面温度 SST 堆栈中每个单独的光栅文件的值70 栅格来自名为 ncin SST 的对象 该对象是使用函数
  • 提取所有列组中共有的元素

    我有一个 R 数据集 x 如下 ID Month 1 1 Jan 2 3 Jan 3 4 Jan 4 6 Jan 5 6 Jan 6 9 Jan 7 2 Feb 8 4 Feb 9 6 Feb 10 8 Feb 11 9 Feb 12 10
  • R 未获取用户库

    我有一个带 R 3 6 0 的 Fedora 30 系统 用户库设置在Renviron就像这个 R LIBS USER R LIBS USER R x86 64 redhat linux gnu library 3 6 事实上 它出现在交互
  • 如何在 R 中创建循环来生成随机样本列表?

    我正在尝试创建一个循环来创建一系列包含随机样本的对象 如下所示 sample lt ceiling runif 9 min 0 max 20 这是圆形制服的示例 但它可以替换为普通 泊松或任何您想要的 因此 我构建了一个循环来自动生成各种生
  • data.table:从不存在的列到现有列的“get”失败,静默失败

    gt d lt data table x 1 5 gt d x 6 y get i 9 Error in get i 9 object i 9 not found gt d y 1 add a new column y gt d x 6 y
  • 如何使用 R 或 PowerShell 从文本文件中提取数据?

    我有一个包含如下数据的文本文件 This is just text Username SOMETHI C Text Account DFAG Finish time 1 JAN 2011 00 31 58 91 Process ID 202
  • 递归累积函数

    我需要在 R 中编写一个累积求和函数 但我一直碰壁 该函数具有以下结构 a x1 a x2 a 2 x1 a x3 a 2 x2 a 3 x1 a x4 a 2 x3 a 3 x2 a 4 x1 等等 cumsum 似乎不适用于此类功能 有
  • 使用 sapply 的列表和矩阵

    我有一个也许是基本的问题 我在网上搜索过 我在读取文件时遇到问题 尽管如此 我还是按照 Konrad的建议设法读取了我的文件 我很欣赏这一点 How to get R to read in files from multiple subdi
  • 使用 ape 包在 R 中进行标签和色叶树状图(系统发育)

    继上一篇文章之后 r 中的标签和彩色叶树状图 https stackoverflow com questions 18802519 label and color leaf dendrogram in r 我有一个后续问题 我的问题与提到的
  • R testthat 单元测试数据和辅助函数约定

    我正在编写一个 R 包 并使用 testthat 进行单元测试 我的许多单元测试都是为了测试适用于我的包特定对象的功能 对于这些测试 我创建了一个辅助函数来设置模拟对象 我还有一些其他辅助函数来减少单元测试中的代码量 目前这些辅助函数在我的
  • R 中 x 轴曲线的阴影面积

    所以我有一个位于 x 轴下方和上方的图表 并且想要对线和 0 之间的区域进行着色 在这里 我尝试使用多边形函数 但它只给出曲线下的面积 plot year difference1 type l polygon year difference
  • 通过删除连续的重复项来减少字符串长度

    我有一个包含 2 个字段的 R 数据框 ID WORD 1 AAAAABBBBB 2 ABCAAABBBDDD 3 我想通过仅保留字母而不是重复中的重复项来简化具有重复字母的单词 e g AAAAABBBBB应该给我AB and ABCAA
  • 用于不规则时间序列的滚动窗口函数,可以处理重复项

    我有以下数据框 grp nr yr 1 A 1 0 2009 2 A 2 0 2009 3 A 1 5 2009 4 A 1 0 2010 5 B 3 0 2009 6 B 2 0 2010 7 B NA 2011 8 C 3 0 2014
  • 双向条形图,两侧带有正标签ggplot2

    我尝试在 ggplot 中创建一个双向条形图 其中轴上方和下方的轴标签和数据标签均为正值 例如 如果您的数据是 myData lt data frame category c yes yes no no month c Jan Feb Ja
  • 如何更改数据表中的少数列名称

    我有一个包含 10 列的数据表 town tc one two three four five six seven total 需要生成我正在使用的列 一 到 总计 的平均值 DTmean lt DT lapply SD mean by t
  • 如何在R中绘制仪表图表?

    如何在 R 中绘制以下图 Red 30 Yellow 40 Green 30 Needle at 52 所以这里有一个完整的ggplot解决方案 注意 从原始帖子中编辑 在仪表中断处添加数字指示器和标签 这似乎是OP在评论中所要求的 如果不
  • R data.table fread 使用不带标题的命名 colClasses(例如没有 col.names?)

    更新 2016 年 6 月 col names 已添加到 data table 1 9 6 所以问题已经结束 每个人都非常高兴 我想我现在可以将所有 read csv 调用转换为 fread 调用 而不必担心破坏 原问题 使用数据表1 9

随机推荐

  • 有没有一个工具可以对 PLSQL 进行负载测试

    我知道 utplsql 用于单元测试 有没有办法可以在循环中使用它来加载测试我的存储过程 我不想使用 JMeter 或通过任何 JDBC 驱动程序 只是想分析普通存储过程的性能 我认为单元测试工具不是正确的方法 因为您并没有真正对功能做出断
  • 你如何向新程序员解释面向对象? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的亲戚正在学习编程 并且很难理解课程 例如 他很难理解您需要实例化它 方法无法访问其他方法中的变量 如果您更改类的一个实例中的变量 则它
  • 使用 sed 更改文件中的字符串?

    我有一个带有模板的输入文件 如下所示 我想更改版本 使用 sed Package somename Priority extra Section checkinstall Maintainer email protected cdn cgi
  • 如何在 Perl 中使用 HTTP::Async 一次发出 25 个请求?

    我正在执行大量 HTTP 请求 并选择 HTTP Async 来完成这项工作 我要发出超过 1000 个请求 如果我只是执行以下操作 请参阅下面的代码 许多请求在处理时就会超时 因为处理到达它们之前可能需要数十分钟 for my url u
  • 报告查看器控件不显示来自 SSRS 的报告

    我在 VS 2013 中使用 MS Report Viewer 10 该项目正在从 VS 2010 升级 我已经解决了一系列与报表查看器相关的问题 并让控件本身启动并运行 我在 SSRS 中有很多报告 并且我已经确认这些报告本身可以正常工作
  • View.playSoundEffect 有问题吗?

    我正在尝试播放声音效果 使用View playSoundEffec 方法 当按钮获得焦点时 问题是除非启用目标手机的声音选择 否则效果将永远不会播放 它可以从以下位置启用 Settings gt Sounds display gt Audi
  • PHP 将 Excel 导入数据库(xls 和 xlsx)

    我尝试搜索一些插件将Excel文件导入MySQL数据库 其中之一是http code google com p php excel reader http code google com p php excel reader 该工具非常强大
  • 如何使用rails运行简单的MYSQL查询

    我想使用 Rails 运行一个简单的 MYSQL 查询 Select movie title movie director from moving order by rating desc limit 5 我不想要创建模型的所有开销 我只想
  • 元组 (a,b)=(b,a) 中的成员交换在内部如何工作?

    In 55 a 5 In 56 b 6 In 57 a b b a In 58 a Out 58 6 In 59 b Out 59 5 a 和 b 的值交换在内部是如何工作的 它绝对不使用临时变量 Python 将右侧表达式与左侧赋值分开
  • android-studio的sdk管理器中没有LLDB

    I am using android studio 3 6 3 in my Manjaro Linux I am trying to run c in android studio for that i need LLDB I reinst
  • ReactJS错误编译失败'define'未定义

    我尝试编译的应用程序未使用外部 jquery 及其关联的 JS 文件进行编译 当我尝试将这些文件链接到 ReactJS 应用程序中的 HTML 页面时 它会抛出以下错误 错误是 define 未定义 no undef 此错误来自 jquer
  • 改造,回调 204 无内容响应?

    在 Android 上 我最初实现了一个像这样的 Retrofit 界面 DELETE USER API BASE URL id public void deleteUser Path id String id Callback
  • 当同级项具有不同宽度时将 Flex 项居中[重复]

    这个问题在这里已经有答案了 我知道 Flexbox 为居中项目提供了一个很好的解决方案 但是当我有 3 个项目并且我希望中心 第二个 项目相对于窗口居中时 我遇到了一个问题 而不管其他 2 个项目的大小 在我的笔中 您可以看到第二项 客户索
  • eclipse neon - 忽略 json 错误

    我的项目中只有很少的 JSON 并将它们导入 Eclipse 后Neon我在文件 和项目 上看到红色标记 抱怨 JSON 问题 我的问题是如何禁用 跳过 忽略 Eclipse Neon 中的 JSON 错误 您可以在下面配置 JSON 验证
  • jquery 文档内部或外部的函数就绪

    到目前为止 我只是将所有 jQuery 优点都放在了 document ready 函数 包括某些用户交互中使用的简单函数 但是不需要加载 DOM 文档或仅在之后调用的函数可以放置在 document ready 以及 例如 考虑一个非常简
  • 在 Python 中使用 try- except-else 是一个好习惯吗?

    在 Python 中 我时常会看到这样的块 try try this whatever except SomeException as exception Handle exception else return something try
  • JPMS ServiceLoader 没有按预期为我工作

    JPMS服务加载器不符合我的预期 我正在尝试提供一个作为可执行 jar 的桌面程序使用默认服务 单个用户可能会超载 用户提供自己的服务类 并在命令行上将其名称作为参数给出 The service package eu ngong mySer
  • 使用 MySQL 通过 JOIN 获取 GROUP BY 中的 SUM

    我在 MySQL 5 1 38 中有两个表 products id name price department 1 Fire Truck 15 00 Toys 2 Bike 75 00 Toys 3 T Shirt 18 00 Clothe
  • 导轨 计数 选择不同的

    我正在记录用户观看一系列视频的次数 现在我正在尝试制作一个图表 显示每天观看任何视频的用户数量 UserVideoWatching where created at gt AND user id 1 month ago User eleph
  • tidytext、quanteda 和 tm 返回不同的 tf-idf 分数

    我正在尝试研究 tf idf 加权语料库 我希望 tf 是按文档划分的比例 而不是简单的计数 我希望所有经典文本挖掘库都会返回相同的值 但我得到了不同的值 我的代码中是否存在错误 例如 我是否需要转置对象 或者 tf idf 计数的默认参数