问题标签 [text2vec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4652 浏览

r - R中真正快速的词ngram向量化

编辑:新包 text2vec 非常好,很好地解决了这个问题(以及许多其他问题)。

CRAN 上的 text2vec github 小插图上的 text2vec,说明了 ngram 标记化

我在 R 中有一个非常大的文本数据集,我已将其作为字符向量导入:

我可以将此字符数据转换为词袋表示,如下所示:

所以 R 可以在大约 3 秒内将 1,000,000 百万个短句向量化为词袋表示(不错!):

我可以将这个稀疏矩阵放入glmnetirlba并对文本数据进行一些非常棒的定量分析。万岁!

现在我想将此分析扩展到 ngram 袋矩阵,而不是词袋矩阵。到目前为止,我发现最快的方法如下(我可以在 CRAN 上找到的所有 ngram 函数都在这个数据集上阻塞,所以我从 SO 得到了一点帮助):

这大约需要 150 秒(对于纯 r 函数来说还不错),但我想更快地扩展到更大的数据集。

R中是否有任何真正快速的函数用于文本的n-gram向量化?理想情况下,我正在寻找一个Rcpp函数,该函数将字符向量作为输入,并返回文档 x ngrams 的稀疏矩阵作为输出,但也很乐意获得一些自己编写 Rcpp 函数的指导。

即使是更快版本的find_ngrams函数也会有所帮助,因为这是主要瓶颈。R 在标记化方面出奇地快。

编辑 1 这是另一个示例数据集:

在这种情况下,创建词袋矩阵的函数大约需要 30 秒,而创建 ngram 矩阵的函数大约需要 500 秒。同样,R 中现有的 n-gram 矢量化器似乎在这个数据集上窒息(尽管我很想被证明是错误的!)

编辑 2 Timings vs tau:

0 投票
3 回答
2432 浏览

r - 在 R 中使用 text2vec 预测下一个单词

我正在 R 中构建一个语言模型,以根据前面的单词预测句子中的下一个单词。目前我的模型是一个简单的 ngram 模型,带有 Kneser-Ney 平滑。它通过在训练集中找到具有最大概率(频率)的 ngram 来预测下一个单词,其中平滑提供了一种插入低阶 ngram 的方法,这在高阶 ngram 具有低频率并且可能无法提供可靠预测的情况下可能是有利的. 虽然这种方法工作得相当好,但在 n-gram 无法捕获上下文的情况下它会失败。例如,“外面很暖和,阳光明媚,我们去...”和“外面很冷,正在下雨,我们去...”将提出相同的预测,因为没有捕获天气的上下文在最后一个 n-gram 中(假设 n<5)。

我正在研究更高级的方法,我发现了 text2vec包,它允许将单词映射到向量空间,其中具有相似含义的单词用相似(接近)向量表示。我有一种感觉,这种表示可能有助于下一个单词的预测,但我无法弄清楚如何准确地定义训练任务。我的问题是 text2vec 是否是用于下一个单词预测的正确工具,如果是,那么可用于此任务的合适预测算法是什么?

0 投票
1 回答
1046 浏览

r - 在 R 的 text2vec 包中,找不到函数“create_vocab_corpus”

我试图从http://dsnotes.com/articles/text2vectext2vec了解包, 但在以下步骤:

现在我们可以构建 DTM。同样,由于所有与语料库构建相关的函数都有流式 API,我们必须创建迭代器并将其提供给 create_vocab_corpus 函数:

此代码引发错误:

错误:找不到函数“create_vocab_corpus”

0 投票
1 回答
1132 浏览

r - 带有插入符号问题的 Text2Vec 分类

一些上下文:在 R 中处理文本分类和大稀疏矩阵

我一直在研究text2vec包和caret. 该计划是text2vec用于构建文档术语矩阵、修剪词汇表和各种预处理的东西,然后尝试不同的模型,caret但我无法得到结果,因为在训练时,插入符号会抛出一些如下所示的错误:

所有的折叠和重复都会发生这种情况。我想在将产生的文档项矩阵转换为text2vec向量时存在问题,因为插入符号需要进行一些计算,但老实说我不确定,这就是这个问题的主要原因。

使用的代码,有一些跳过的部分,如下所示。请注意,我提供了返回caret的文档术语矩阵的直接结果,text2vec我不完全确定这是否可以。

正如我所说,启动 train() 函数时会出现问题。dtm_train 对象属于以下类别:

结构如下所示:

我究竟做错了什么?如果在文档中暗示可以使用这种数据,为什么插入符号无法使用?

0 投票
1 回答
1216 浏览

r - R-转换新数据中的text2vec?

有关于为 text2vec 包创建 DTM(文档术语矩阵)的文档,例如在构建矩阵后应用 TFIDF 加权的以下内容:

通常的做法是基于训练数据集创建 DTM,并将该数据集用作模型的输入。然后,当遇到新数据(测试集)时,需要在新数据上创建相同的 DTM(意味着在训练集中使用的所有相同术语)。包中是否有以这种方式转换新数据集的方法(在 scikit 中,我们有一个仅用于这种类型实例的转换方法)。

0 投票
1 回答
2792 浏览

r - 在 text2vec R 包中准备词嵌入

基于 text2vec 包的小插图,提供了一个创建词嵌入的示例。维基数据被标记化,然后创建术语共现矩阵 (TCM),用于使用包中提供的 glove 函数创建词嵌入。我想为随包提供的电影评论数据构建词嵌入。我的问题是:

  1. 我是否需要将所有电影评论折叠成一个长字符串,然后进行标记化。

这将导致 2 个评论之间的边界标记同时出现,这是没有意义的。

我有兴趣为其开发词嵌入的数据可以得到如下:

0 投票
1 回答
437 浏览

r - 在 R 中使用 text2vec 计算未加权的基于词袋的 TCM?

我正在尝试使用 in 中的text2vec包从语料库中计算术语术语共现矩阵(或 TCM) R(因为它有一个很好的并行后端)。我遵循了本教程,但是在检查一些玩具示例时,我注意到该create_tcm函数对术语-术语共现值进行了某种缩放或加权。我知道它在内部使用skip-grams,但文档没有提到它是如何缩放它们的——显然,更远的术语/unigrams 的权重更低。

这是一个例子:

问题:有什么方法可以禁用这种行为,以便在 skip-gram 窗口中的每个术语/单字都得到同等对待?即,如果一个词在语料库中两次出现在另一个词的上下文窗口内,则它应该在 TCM 矩阵中显示为“2”。

额外的问题:默认缩放是如何工作的?如果在最后一个示例中添加更多的“a”,则 bc 值似乎线性减小,而 ba 值实际上增加了——尽管出现更多的“a”或“a”看起来离“b”更远。

0 投票
1 回答
358 浏览

matrix - 如何在 text2vec 中对齐两个 GloVe 模型?

假设我已经基于两个不同的语料库训练了两个独立的 GloVe 向量空间模型(使用text2vecin )。R这样做可能有不同的原因:例如,两个基本语料库可能来自两个不同的时间段,或者两个非常不同的体裁。我有兴趣比较这两个语料库之间单词的用法/含义。如果我只是将两个语料库和它们的词汇表连接起来,那是行不通的(具有不同用法的词对在向量空间中的位置将只是在“中间”的某个地方)。

我最初的想法是只训练一个模型,但是在准备文本时,为每个单词附加一个后缀 (_x, _y)(其中 x 和 y 代表语料库 x/y 中单词 A 的用法),并保留没有后缀的每个语料库的单独副本,因此最终连接的训练语料库的词汇表将包括:A,A_x,A_y,B,B_x,B_y ...等,例如:

我认为 A 和 B 的“平均”用法可以作为空间的某种“坐标”,并且我可以测量同一空间中 A_x 和 A_y 之间的距离。但后来我意识到,由于 A_x 和 A_y 永远不会出现在同一个上下文中(由于所有单词的后缀,包括它们周围的单词),这可能会扭曲空间并且不起作用。我也知道有一个叫做正交 procrustes 问题的东西,它与对齐矩阵有关,但我不知道如何为我的案例实现它。

如果我的最终目标是测量单词对的余弦相似度,那么将两个 GloVe 模型(最好是在 中R,以便它们与text2vec不同的语料库?

0 投票
1 回答
1575 浏览

r - text2vec 的词干提取功能

我在 R 中使用 text2vec 并且难以编写与 text2vec 包中的 itoken 函数一起使用的词干函数。text2vec 文档建议使用此词干提取功能:

但是,此功能不起作用。这是我运行的代码(借用以前的 stackoverflow 答案):

这是它产生的错误:

{ 中的错误:缺少参数“words”,没有默认值

我认为问题在于 wordStem 需要一个字符向量,但 word_tokenizer 会生成一个字符向量列表。

SnowballC::wordStem(language = "en") 中的错误:缺少参数“words”,没有默认值

为了解决这个问题,我写了这个词干函数:

但是,此函数不适用于 create_vocabulary 函数。

没有错误,但是当您查看文档计数时,文档的数量与数据中的 1000 不同,因此您无法创建文档术语矩阵或运行 LDA。

[1] 10

这段代码:

产生此错误:

10 x 3809 类“dgCMatrix”的稀疏矩阵 validObject(x) 中的错误:无效类“dgCMatrix”对象:长度(Dimnames[1])不同于 Dim[1],即 10

我的问题是:我写的函数有问题吗,为什么我写的函数会在 create_vocabulary 中产生这个错误?我怀疑这是我的函数输出格式的问题,但它看起来与 word_tokenizer 函数的输出格式相同,并且适用于 itoken 和 create_vocabulary:

0 投票
2 回答
248 浏览

r - text2vec:使用函数 create_vocabulary 后迭代词汇表

使用 text2vec 包,我创建了一个词汇表。

词汇看起来像这样

如何检查列 terms_counts 的范围?我需要这个,因为它在修剪过程中对我有帮助,这是我的下一步

下面的代码是可重现的