使用 BERTMODEL 的单词相似度

数据挖掘 nlp 词嵌入 相似 伯特
2021-09-22 23:59:49

我想在 NER 任务中使用 BERT 模型找到单词的相似性。我有自己的数据集,所以我不想使用预训练模型。我执行以下操作:

from transformers import BertModel
hidden_reps, cls_head = BertModel(token_ids , attention_mask = attn_mask , token_type_ids = seg_ids)

在哪里

token_ids with Shape : [1, 4, 47]
attn_mask with Shape : [1, 4, 47]
seg_ids with Shape : [1, 4, 47]

但我有一个错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-74-5fa632122cc7> in <module>()
      1 from transformers import BertModel
----> 2 hidden_reps, cls_head = BertModel(token_ids , attention_mask = attn_mask , token_type_ids = seg_ids)

TypeError: __init__() got an unexpected keyword argument 'attention_mask'

我该如何解决这个错误?

以及如何使用此模型找到给定单词的单词嵌入和相似度?

我找不到此任务的任何教程或类似代码。

2个回答

首先,我认为您对pretrainedand感到困惑finetuned

BERTpretrained处理大量文本数据。通过使用这个pretrainedBERT,你就拥有了一个已经了解文本的模型。

然后 BERT 可以finetuned在特定的数据集上,BERT 在其中学习与数据集相关的特定知识。这就是为什么微调的 BERT 在其他数据集上不好的原因:知识不适用。

您有一个自定义数据集。所以你不想使用finetuned模型,但仍想使用pretrained模型(以获取 BERT 的一般知识)。

如果你从头开始使用 BERT 模型(不是pretrained),你基本上是在创建一个空模型,随机初始化:它没用


现在我们已经澄清了这一点,让我们看看你的问题。

您正在做的是使用传递BertModel的参数调用构造函数。forward您首先需要创建模型,然后使用forwardpass :

from transformers import BertModel, BertConfig
config = BertConfig(...)    # Here your parameters to initialize your BERT as you want, such as number of heads, etc...
model = BertModel(config)
hidden_reps, cls_head = model(token_ids, attention_mask=attn_mask, token_type_ids=seg_ids)

但是,正如我在第一部分中解释的那样,你不应该这样做:它完全没用,你的结果将是随机的。您想使用pretrainedBERT 来获得一些有意义的结果:

from transformers import BertModel
model = BertModel.from_pretrained('bert-base-uncased')
hidden_reps, cls_head = model(token_ids, attention_mask=attn_mask, token_type_ids=seg_ids)

finetune注意:如果您在自定义数据集上使用 BERT 模型,则可以进一步改进您的结果。


最后一点:不要重新发明轮子

人们已经尝试将 BERT 用于单词相似度。与其从头开始实现,只使用一个pretrained模型,可能会在您自己的实现中添加错误,只需使用一些已经存在的代码!

我不确定 NER,但是对于单词相似度,你可以看看BERT Score他们的模型已经针对单词相似度进行了微调,因此使用这种方法很可能会获得更高的分数,并且走起来也更容易。

如果获得单词相似度是您的主要目标,我建议您从 genism 中查看 Word2Vec

您甚至可以在您的语料库上训练一个简单的网络并获取最相似的词(向量)。