问题标签 [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.
r - R中真正快速的词ngram向量化
编辑:新包 text2vec 非常好,很好地解决了这个问题(以及许多其他问题)。
CRAN 上的 text2vec github 小插图上的 text2vec,说明了 ngram 标记化
我在 R 中有一个非常大的文本数据集,我已将其作为字符向量导入:
我可以将此字符数据转换为词袋表示,如下所示:
所以 R 可以在大约 3 秒内将 1,000,000 百万个短句向量化为词袋表示(不错!):
我可以将这个稀疏矩阵放入glmnet或irlba并对文本数据进行一些非常棒的定量分析。万岁!
现在我想将此分析扩展到 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:
r - 在 R 中使用 text2vec 预测下一个单词
我正在 R 中构建一个语言模型,以根据前面的单词预测句子中的下一个单词。目前我的模型是一个简单的 ngram 模型,带有 Kneser-Ney 平滑。它通过在训练集中找到具有最大概率(频率)的 ngram 来预测下一个单词,其中平滑提供了一种插入低阶 ngram 的方法,这在高阶 ngram 具有低频率并且可能无法提供可靠预测的情况下可能是有利的. 虽然这种方法工作得相当好,但在 n-gram 无法捕获上下文的情况下它会失败。例如,“外面很暖和,阳光明媚,我们去...”和“外面很冷,正在下雨,我们去...”将提出相同的预测,因为没有捕获天气的上下文在最后一个 n-gram 中(假设 n<5)。
我正在研究更高级的方法,我发现了 text2vec包,它允许将单词映射到向量空间,其中具有相似含义的单词用相似(接近)向量表示。我有一种感觉,这种表示可能有助于下一个单词的预测,但我无法弄清楚如何准确地定义训练任务。我的问题是 text2vec 是否是用于下一个单词预测的正确工具,如果是,那么可用于此任务的合适预测算法是什么?
r - 在 R 的 text2vec 包中,找不到函数“create_vocab_corpus”
我试图从http://dsnotes.com/articles/text2vectext2vec
了解包,
但在以下步骤:
现在我们可以构建 DTM。同样,由于所有与语料库构建相关的函数都有流式 API,我们必须创建迭代器并将其提供给 create_vocab_corpus 函数:
此代码引发错误:
错误:找不到函数“create_vocab_corpus”
r - 带有插入符号问题的 Text2Vec 分类
一些上下文:在 R 中处理文本分类和大稀疏矩阵
我一直在研究text2vec
包和caret
. 该计划是text2vec
用于构建文档术语矩阵、修剪词汇表和各种预处理的东西,然后尝试不同的模型,caret
但我无法得到结果,因为在训练时,插入符号会抛出一些如下所示的错误:
所有的折叠和重复都会发生这种情况。我想在将产生的文档项矩阵转换为text2vec
向量时存在问题,因为插入符号需要进行一些计算,但老实说我不确定,这就是这个问题的主要原因。
使用的代码,有一些跳过的部分,如下所示。请注意,我提供了返回caret
的文档术语矩阵的直接结果,text2vec
我不完全确定这是否可以。
正如我所说,启动 train() 函数时会出现问题。dtm_train 对象属于以下类别:
结构如下所示:
我究竟做错了什么?如果在文档中暗示可以使用这种数据,为什么插入符号无法使用?
r - R-转换新数据中的text2vec?
有关于为 text2vec 包创建 DTM(文档术语矩阵)的文档,例如在构建矩阵后应用 TFIDF 加权的以下内容:
通常的做法是基于训练数据集创建 DTM,并将该数据集用作模型的输入。然后,当遇到新数据(测试集)时,需要在新数据上创建相同的 DTM(意味着在训练集中使用的所有相同术语)。包中是否有以这种方式转换新数据集的方法(在 scikit 中,我们有一个仅用于这种类型实例的转换方法)。
r - 在 text2vec R 包中准备词嵌入
基于 text2vec 包的小插图,提供了一个创建词嵌入的示例。维基数据被标记化,然后创建术语共现矩阵 (TCM),用于使用包中提供的 glove 函数创建词嵌入。我想为随包提供的电影评论数据构建词嵌入。我的问题是:
- 我是否需要将所有电影评论折叠成一个长字符串,然后进行标记化。
这将导致 2 个评论之间的边界标记同时出现,这是没有意义的。
我有兴趣为其开发词嵌入的数据可以得到如下:
r - 在 R 中使用 text2vec 计算未加权的基于词袋的 TCM?
我正在尝试使用 in 中的text2vec
包从语料库中计算术语术语共现矩阵(或 TCM) R
(因为它有一个很好的并行后端)。我遵循了本教程,但是在检查一些玩具示例时,我注意到该create_tcm
函数对术语-术语共现值进行了某种缩放或加权。我知道它在内部使用skip-grams,但文档没有提到它是如何缩放它们的——显然,更远的术语/unigrams 的权重更低。
这是一个例子:
问题:有什么方法可以禁用这种行为,以便在 skip-gram 窗口中的每个术语/单字都得到同等对待?即,如果一个词在语料库中两次出现在另一个词的上下文窗口内,则它应该在 TCM 矩阵中显示为“2”。
额外的问题:默认缩放是如何工作的?如果在最后一个示例中添加更多的“a”,则 bc 值似乎线性减小,而 ba 值实际上增加了——尽管出现更多的“a”或“a”看起来离“b”更远。
matrix - 如何在 text2vec 中对齐两个 GloVe 模型?
假设我已经基于两个不同的语料库训练了两个独立的 GloVe 向量空间模型(使用text2vec
in )。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
不同的语料库?
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:
r - text2vec:使用函数 create_vocabulary 后迭代词汇表
使用 text2vec 包,我创建了一个词汇表。
词汇看起来像这样
如何检查列 terms_counts 的范围?我需要这个,因为它在修剪过程中对我有帮助,这是我的下一步
下面的代码是可重现的