问题标签 [spacy-transformers]
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.
python - Model() 为参数“nr_class”获取了多个值 - SpaCy 多分类模型(BERT 集成)
嗨,我正在使用新的 SpaCy 模型实现多分类模型(5 类)en_pytt_bertbaseuncased_lg
。新管道的代码在这里:
培训代码如下,基于此处的示例(https://pypi.org/project/spacy-pytorch-transformers/):
所以我的数据结构如下所示:
我不确定为什么会出现以下错误:
编辑:
如果我取出 nr_class 参数,我会在这里得到这个错误:
我实际上认为这会发生,因为我没有指定 nr_class 参数。那是对的吗?
machine-learning - spacy-pytorch-transformers: loss = 0 在训练期间不断
我正在使用spacy 2.1.8
并spacy-pytorch-transformers 0.4.0
训练一个文本分类器。我的代码受到他们示例的强烈启发,但模型没有学习任何东西,这似乎是由于损失一直为 0 造成的。我的代码的最小(非)工作示例如下:
我已经两次和三次检查了相关变量,例如cats
and texts
,是否包含有效和正确的值。
有什么我想念的吗?
python - 如何在 spacy-pytorch-transformers 中计算令牌向量
我目前正在使用该spacy-pytorch-transformer
软件包来试验各自的嵌入。
在阅读介绍性文章(基本上是 GitHub README)时,我的理解是令牌级别的嵌入是所有相应词块嵌入的平均值,即embed(complex)
与1/2 * embed(comp#) * embed(#lex)
.
根据 BERT 论文,这应该简单地利用last_hidden_state
网络的属性,但我下面的 MCVE 表明,对于 Spacy 2.1.8 和 spacy-pytorch-transformers 0.4.0,这并不相同,至少对于 BERT 和 RoBERTa(有未针对更多型号进行验证):
隐藏状态的偏移量为 1 是由于<CLS>
token 作为第一个输入,对应句子分类任务;我什至为我的句子检查了任何可用的其他标记(根据 没有标记对齐问题doc._.pytt_alignment
),所以我不可能在这里错过任何东西。
根据源代码,相应的钩子简单地覆盖以返回张量中的相应行,所以我在这里看不到任何转换。我在这里是否缺少明显的东西,或者这是否偏离了预期的行为?
nlp - pytorch 中预训练的 BERT 错误的权重初始化
我正在尝试使用 pytorch 使用预训练模型(BERT)来训练模型。预训练的模型权重仍然不被接受。
我看到这个错误:
这是完整的回溯:
任何帮助都会很棒。提前致谢
python - 如何在 Google Colab 中开始使用 spacy 库及其模块?
我在Spacy
加载colab
GPU 笔记本时遇到了模块问题。
此命令适用于anaconda
笔记本下载,但如何在 Google 中下载Colab
并加载模块?
machine-learning - SpaCy-transformers 回归输出
我想要一个回归输出而不是分类。例如:我想要一个从 0 到 1 的浮点输出值,而不是 n 个类。
这是来自包 github 页面的简约示例:
有没有一种简单的方法可以trf_textcat
作为回归者工作?还是意味着扩展图书馆?
nlp - 使用 Spacy 进行文本分类:超越基础以提高性能
我正在尝试在文本训练数据集(Reddit 帖子)上训练一个文本分类器,该数据集具有两个专有类(1 和 0),涉及帖子作者的特征,而不是帖子本身。
类不平衡:大约 75:25,这意味着 75% 的作者是“0”,而 25% 是“1”。
整个数据集由 3 列组成:第一列代表帖子的作者,第二列代表帖子所属的 subreddit,第三列代表实际帖子。
数据
数据集如下所示:
其中 postI_J 是第 I 个作者的第 J 个帖子。请注意,在此数据集中,同一作者可能会出现多次,如果她/他发布了多次。
在一个单独的数据集中,我有每个作者所属的类。
我做的第一件事是按作者分组:
总共有 5000 个作者,4000 个用于训练,1000 个用于验证(roc_auc 分数)。这是我正在使用的 spaCy 代码(train_texts
是train_data_full_agg.body.tolist()
我用于训练的子集,而test_texts
我用于验证的代码)。
问题
如果与可以使用 scikit learn 编写的更简单算法(如 tfidf、bow、词嵌入等)相比,我的性能也很差(在我没有标签的测试数据集上使用 ROC 测量)
尝试
我试图通过以下过程获得更好的性能:
- 文本的各种预处理/词形还原:最好的方法似乎是删除所有标点符号、数字、停用词、词汇表之外的单词,然后对所有剩余的词进行词形还原
- 尝试过的 textcat 架构:集成、弓(也带有
ngram_size
和attr
参数):最好的似乎是集成,如spaCy 文档。 - 试图包含 subreddit 信息:我通过在相同的 4000 个作者的
subreddit
列上训练一个单独的 textcat 来做到这一点(请参阅第 5 点,以了解如何使用来自此步骤的信息)。 - 试图包含词嵌入信息:使用来自
en_core_web_lg-2.2.5
spaCy 模型的文档向量,我在相同的 4000 个作者的聚合帖子上训练了一个 scikit 多层感知器。(请参阅第 5 点,了解如何使用来自此步骤的信息)。 - 然后,为了混合来自 subreddits、帖子和文档向量的信息,我对三个模型的 1000 个预测进行了逻辑回归训练(我还尝试在最后一步使用adasyn来平衡类
使用这个逻辑回归,我在测试数据集上得到 ROC = 0.89。如果我删除这些步骤中的任何一个并使用中间模型,ROC 就会降低。
我还尝试了以下步骤,这再次降低了 ROC:
- 使用预训练的模型,例如 bert。我使用的代码类似于这个
- 从一开始就尝试平衡类,因此使用较小的训练集。
- 试图留下标点符号并将 a放在管道
sentencizer
的开头nlp
附加信息(主要来自评论)
问:多项式朴素贝叶斯或 SVM 等基线模型的 ROC 是多少?
我可以轻松访问仅在文本上评估的 ROC(没有 subreddits 或向量)。一个 svm 设置如下:
svm= svm.SVC(C=1.0, kernel='poly', degree=2, gamma='scale', coef0=0.0, shrinking=True, probability=True, tol=0.001, cache_size=200, class_weight=None, max_iter=-1)
将给出 roc(使用 CountVectorizer bow)= 0.53(与 rbf 内核相同,但 rbf + class_weight = None 或“平衡”给出 0.63(相同,没有对 cache_size 的约束))。无论如何,一个 XGBregressor使用 gridsearch 设置的参数将给出 roc = 0.88。相同的 XGB,但也带有 CountVectorizer subreddits 和 scikit Doc2Vec 向量(与上面的 lr 结合)给出了大约 93。您在上面看到的集成代码,仅在文本上会给出大约 83。使用 subreddts 和向量(如上处理)给出 89问:你试过不连接吗?
如果我不连接,性能(只是在未连接的文本上,所以再次没有向量/subreddits)类似于我连接的情况,但我不知道如何将同一作者的多个预测组合成一个预言。因为请记住,我有来自每个作者的更多评论,并且我必须预测关于作者的二元特征。
问题
- 你对我正在使用的 spaCy 代码有什么特别的建议吗(例如,使用 subreddits 和/或文档向量信息的任何其他方式)?
- 如何改进整体模型?
任何建议都受到高度赞赏。
由于我是 NLP 新手,请在代码/解释/参考方面尽可能明确。
python - 为什么我的训练函数会抛出名称错误“名称衰减未定义”?
所以,我是 NLP 的新手,我正在尝试使用 spacy_transformers 训练一个文本分类器。此代码已显示可以运行,但它会在我的计算机上引发错误。作为旁注,这可能是由于我在 cpu 上运行它的脂肪引起的吗?
然后当我通过函数
我收到以下错误
python - 使用 huggingface fill-mask 管道来获得它没有建议的结果的“分数”
我一直在使用 huggingface 对蒙面令牌进行预测,效果很好。我注意到,对于每个预测,它都会给出一个“分数”,并且希望为一些它没有预测但我提供的标记给出“分数”。
例如,如果我的句子是"I ate bacon and <mask> for breakfast"
我可以pipeline('fill-mask')
用来取回预测和他们的分数,例如它可能会给我返回 ["eggs", 0.1]。但我想做的是提供我自己的猜测,然后取回它分配给我自己猜测的分数。例如,我可能想知道在这种情况下它对“煎饼”这个词的评分。
这可能吗?