标签: bert-language-model

Huggingface BERT Tokenizer 添加新令牌

我正在使用 Huggingface BERT 来执行 NLP 任务。我的文本包含被分成子词的公司名称。

tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased')
tokenizer.encode_plus("Somespecialcompany")
output: {'input_ids': [101, 2070, 13102, 8586, 4818, 9006, 9739, 2100, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}
Run Code Online (Sandbox Code Playgroud)

现在,我想将这些名称添加到标记器 ID 中,这样它们就不会被分割。

tokenizer.add_tokens("Somespecialcompany")
output: 1
Run Code Online (Sandbox Code Playgroud)

这将分词器的长度从 30522 扩展到 30523。

因此,所需的输出将是新的 ID:

tokenizer.encode_plus("Somespecialcompany")
output: 30522
Run Code Online (Sandbox Code Playgroud)

但输出与之前相同:

output: {'input_ids': [101, 2070, 13102, 8586, 4818, 9006, 9739, 2100, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, …
Run Code Online (Sandbox Code Playgroud)

bert-language-model huggingface-transformers huggingface-tokenizers

6
推荐指数
1
解决办法
9102
查看次数

如何取消 BERT 代币的代币化?

我有一个句子,我需要返回特定单词左右两侧 N 个 BERT 标记对应的文本。

from transformers import BertTokenizer
tz = BertTokenizer.from_pretrained("bert-base-cased")
sentence = "The Natural Science Museum of Madrid shows the RECONSTRUCTION of a dinosaur"

tokens = tz.tokenize(sentence)
print(tokens)

>>['The', 'Natural', 'Science', 'Museum', 'of', 'Madrid', 'shows', 'the', 'R', '##EC', '##ON', '##ST', '##R', '##UC', '##TI', '##ON', 'of', 'a', 'dinosaur']
Run Code Online (Sandbox Code Playgroud)

我想要的是获取与令牌马德里左侧和右侧的4个令牌相对应的文本。所以我想要标记: ['Natural', 'Science', 'Museum', 'of', 'Madrid', 'shows', 'the', 'R', '##EC'] 然后将它们转换为原文。在本例中,它将是“马德里自然科学博物馆展示 REC”。

有没有办法做到这一点?

python tokenize bert-language-model huggingface-transformers huggingface-tokenizers

6
推荐指数
2
解决办法
8329
查看次数

从转换器导入 BertTokenizer 时出现导入错误

我的代码是:

import torch
from transformers import BertTokenizer
from IPython.display import clear_output
Run Code Online (Sandbox Code Playgroud)

我在行中遇到错误from transformers import BertTokenizer

ImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by /mnt/home/wbj/anaconda3/envs/pytorch/lib/python3.8/site-packages/tokenizers/tokenizers.cpython-38-x86_64-linux-gnu.so)
Run Code Online (Sandbox Code Playgroud)

我找到了一个答案,问题是由于文件引起的/lib/x86_64-linux-gnu/libm.so.6,当我使用代码时,strings /lib/x86_64-linux-gnu/libm.so.6 | grep GLIBC_我得到了输出

GLIBC_2.2.5
GLIBC_2.4
GLIBC_2.15
GLIBC_2.18
GLIBC_2.23
GLIBC_PRIVATE
Run Code Online (Sandbox Code Playgroud)

该文件不支持 GLIBC_2.29。我该如何解决这个问题?

python importerror bert-language-model

6
推荐指数
1
解决办法
3407
查看次数

训练后如何测试掩码语言模型?

我已经按照 Hugging Face 使用 BERT 进行屏蔽语言建模的教程进行操作,但我不确定如何实际部署该模型。

教程:https://github.com/huggingface/notebooks/blob/master/examples/language_modeling.ipynb

我已经使用自己的数据集训练了模型,效果很好,但我不知道如何实际使用该模型,因为遗憾的是,笔记本中没有包含如何执行此操作的示例。

我想用我的训练模型做什么的示例

在 Hugging Face 网站上,这是示例中使用的代码;因此,我想用我的模型做这件事:

>>> from transformers import pipeline
>>> unmasker = pipeline('fill-mask', model='bert-base-uncased')
>>> unmasker("Hello I'm a [MASK] model.")

[{'sequence': "[CLS] hello i'm a fashion model. [SEP]",
  'score': 0.1073106899857521,
  'token': 4827,
  'token_str': 'fashion'},
 {'sequence': "[CLS] hello i'm a role model. [SEP]",
  'score': 0.08774490654468536,
  'token': 2535,
  'token_str': 'role'},
 {'sequence': "[CLS] hello i'm a new model. [SEP]",
  'score': 0.05338378623127937,
  'token': 2047,
  'token_str': 'new'},
 {'sequence': "[CLS] hello i'm a super model. [SEP]", …
Run Code Online (Sandbox Code Playgroud)

python nlp bert-language-model huggingface-transformers

6
推荐指数
1
解决办法
2749
查看次数

为什么 Python 不导入 Transformer?

我想在 jupyter Notebook 中导入 Transformer,但出现以下错误。出现这个错误的原因是什么?我的Python版本是3.8

ImportError:无法从“typing_extensions”导入名称“TypeAlias”

我也更新了typing-extensions库版本,但是问题没有解决

python bert-language-model huggingface-transformers

6
推荐指数
1
解决办法
4569
查看次数

如何增量添加索引到python FAISS

我正在使用 Faiss 来索引我的巨大数据集嵌入,即从 bert 模型生成的嵌入。我想增量添加嵌入,如果我仅使用 faiss.IndexFlatL2 添加它,它就可以正常工作,但问题是在保存它时它的大小太大。所以我尝试使用 faiss.IndexIVFPQ,但它需要在添加数据之前训练嵌入,所以我无法增量添加它,我必须先计算所有嵌入,然后训练并添加它,它有问题,因为所有数据应该保存在 RAM 中直到我写它。有什么办法可以逐步做到这一点。这是我的代码:

    # It is working fine when using with IndexFlatL2
    def __init__(self, sentences, model):
        self.sentences = sentences
        self.model = model
        self.index = faiss.IndexFlatL2(768)

    def process_sentences(self):
        result = self.model(self.sentences)
        self.sentence_ids = []
        self.token_ids = []
        self.all_tokens = []
        for i, (toks, embs) in enumerate(tqdm(result)):
            # initialize all_embeddings for every new sentence (INCREMENTALLY)
            all_embeddings = []
            for j, (tok, emb) in enumerate(zip(toks, embs)):
                self.sentence_ids.append(i)
                self.token_ids.append(j)
                self.all_tokens.append(tok)
                all_embeddings.append(emb)

            all_embeddings = np.stack(all_embeddings) # Add embeddings …
Run Code Online (Sandbox Code Playgroud)

python nlp python-3.x bert-language-model faiss

6
推荐指数
0
解决办法
5726
查看次数

如何使用 BERT 预测空字符串的概率

假设我们有一个这样的模板句子:

  • “____房子是我们见面的地方。”

我们有一个形容词列表来填补空白,例如:

  • “黄色的”
  • “大的”
  • ””

请注意,其中之一是空字符串。

目标是比较在给定句子上下文的情况下选择最有可能描述“房子”的单词的概率。如果更有可能什么都没有,也应该考虑到这一点。

我们可以预测每个单词填空的概率,但是我们如何预测没有形容词来描述“房子”的可能性呢?

预测一个单词的概率:

from transformers import BertTokenizer, BertForMaskedLM
import torch
from torch.nn import functional as F

# Load BERT tokenizer and pre-trained model
tokenizer = BertTokenizer.from_pretrained('bert-large-uncased')
model = BertForMaskedLM.from_pretrained('bert-large-uncased', return_dict=True)

targets = ["yellow", "large"]
sentence = "The [MASK] house is our meeting place."

# Using BERT, compute probability over its entire vocabulary, returning logits
input = tokenizer.encode_plus(sentence, return_tensors = "pt") 
mask_index = torch.where(input["input_ids"][0] == tokenizer.mask_token_id)[0] 
with torch.no_grad():
    output = model(**input) 

# …
Run Code Online (Sandbox Code Playgroud)

python nlp bert-language-model huggingface-transformers

6
推荐指数
1
解决办法
888
查看次数

Pytorch 期望每个张量大小相等

运行此代码时:embedding_matrix = torch.stack(embeddings)

我收到这个错误:

RuntimeError: stack expects each tensor to be equal size, but got [7, 768] at entry 0 and [8, 768] at entry 1
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过以下方式使用 BERT 进行嵌入:

    split_sent = sent.split()
    tokens_embedding = []
    j = 0
    for full_token in split_sent:
        curr_token = ''
        x = 0
        for i,_ in enumerate(tokenized_sent[1:]): 
            token = tokenized_sent[i+j]
            piece_embedding = bert_embedding[i+j]
            if token == full_token and curr_token == '' :
               tokens_embedding.append(piece_embedding)
               j += 1
               break                                     
    sent_embedding = torch.stack(tokens_embedding)
    embeddings.append(sent_embedding)
embedding_matrix = torch.stack(embeddings) …
Run Code Online (Sandbox Code Playgroud)

python pytorch tensor bert-language-model

6
推荐指数
1
解决办法
3万
查看次数

如何修复 BERTopic 的随机种子?

我想修复BERTopic库中的随机种子以获得可重现的结果。查看 BERTopic 的代码,我发现它使用了 numpy。使用就np.random.seed(123)足够了吗?或者我是否还需要其他库,如这个问题中的 random 或 pytorch 。

python bert-language-model

6
推荐指数
1
解决办法
3098
查看次数

变压器的 max_seq_length (Sentence-BERT)

我按以下方式使用 Huggingface 的句子 BERT:

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
model.max_seq_length = 512
model.encode(text)
Run Code Online (Sandbox Code Playgroud)

text很长且包含超过 512 个标记时,不会抛出异常。我假设它会自动将输入截断为 512 个标记。

当输入长度大于时如何使其抛出异常max_seq_length

此外, 的最大可能是max_seq_length多少all-MiniLM-L6-v2

nlp bert-language-model huggingface-transformers huggingface-tokenizers sentence-transformers

6
推荐指数
1
解决办法
6666
查看次数