在准备好ChineseNER_input_data后,开始跑NER出现的问题

在尝试运行ChineseNER项目并准备了输入数据后,遇到了训练过程中的AssertionError。问题出现在`loader.py`的第33行,原本的代码检查word长度是否大于等于2。通过注释掉该断言来解决此错误,之后程序得以继续运行。

第一次跑

C:\Users\Administrator\Desktop\ChineseNER>python main.py --train=True --clean=T

Building prefix dict from E:\python3\lib\site-packages\jieba\dict.txt ...
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.144 seconds.
Prefix dict has been built succesfully.
['O']
Traceback (most recent call last):
  File "main.py", line 225, in <module>
    if __name__ == "__main__":
  File "E:\python3\lib\site-packages\tensorflow\python\platform\app.py", line 48
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "main.py", line 219, in main
    clean(FLAGS)
  File "main.py", line 106, in train
    # load data sets
  File "C:\Users\Administrator\Desktop\ChineseNER\loader.py", line 33, in load_s
    assert len(word) >= 2, print([word[0]])

AssertionError: None

改错:将loader.py", line 33,的

assert len(word) >= 2, print([word[0]]) 

注释掉



第二次跑

C:\Users\Administrator\Desktop\ChineseNER>python main.py --train=True --clean=T

Building prefix dict from E:\python3\lib\site-packages\jieba\dict.txt ...
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.261 seconds.
Prefix dict has been built succesfully.
Found 1418 unique words (165783 in total)
Loading pretrained embeddings from wiki_100.utf8...
Found 20 unique named entity tags
1 / 0 / 1 sentences in train / dev / test.
2018-07-11 15:55:36,811 - log\train.log - INFO - num_chars      :       1541
2018-07-11 15:55:36,812 - log\train.log - INFO - char_dim       :       100
2018-07-11 15:55:36,812 - log\train.log - INFO - num_tags       :       20
2018-07-11 15:55:36,813 - log\train.log - INFO - seg_dim        :       20
2018-07-11 15:55:36,816 - log\train.log - INFO - lstm_dim       :       100
2018-07-11 15:55:36,817 - log\train.log - INFO - batch_size     :       20
2018-07-11 15:55:36,817 - log\train.log - INFO - emb_file       :       wiki_100
2018-07-11 15:55:36,817 - log\train.log - INFO - clip           :       5
2018-07-11 15:55:36,817 - log\train.log - INFO - dropout_keep   :       0.5
2018-07-11 15:55:36,818 - log\train.log - INFO - optimizer      :       adam
2018-07-11 15:55:36,818 - log\train.log - INFO - lr             :       0.001
2018-07-11 15:55:36,821 - log\train.log - INFO - tag_schema     :       iobes
2018-07-11 15:55:36,821 - log\train.log - INFO - pre_emb        :       True
2018-07-11 15:55:36,821 - log\train.log - INFO - zeros          :       False
2018-07-11 15:55:36,821 - log\train.log - INFO - lower          :       True
2018-07-11 15:55:36.822838: W c:\tf_jenkins\home\workspace\release-win\m\windows
SSE instructions, but these are available on your machine and could speed up CPU
2018-07-11 15:55:36.822946: W c:\tf_jenkins\home\workspace\release-win\m\windows
SSE2 instructions, but these are available on your machine and could speed up CP
2018-07-11 15:55:36.823026: W c:\tf_jenkins\home\workspace\release-win\m\windows
SSE3 instructions, but these are available on your machine and could speed up CP
2018-07-11 15:55:36.823112: W c:\tf_jenkins\home\workspace\release-win\m\windows
<think>好的,用户想了解如何用BERT-BiLSTM-CRF模型实现命名实体识别。首先,我需要整理这个模型的组成部分和它们各自的作用。 首先,BERT作为预训练模型,能生成上下文相关的词向量,这比传统的Word2Vec或GloVe更好。接下来是BiLSTM层,它能捕捉文本的前后信息,处理序列依赖的问题。然后是CRF层,用于考虑标签之间的转移规则,比如“B-PER”后面应该是“I-PER”而不是“O”标签。 接下来,我需要考虑具体的实现步骤。用户可能需要知道数据准备、模型构建、训练和评估这些关键步骤。数据方面,应该使用标准的NER数据集,如CoNLL-2003或中文的MSRA。预处理部分需要处理文本和标签的对齐,特别是BERT的分词器可能会把单词分成子词,需要调整标签。例如,“London”可能被分成“Lon”和“##don”,对应的标签需要是“B-LOC”和“I-LOC”。 然后是模型结构。根据引用中的资料,模型需要先加载BERT,然后接BiLSTM,最后是CRF。在PyTorch中,可以用Hugging Face的transformers库来加载BERT模型。BiLSTM层需要注意输入输出的维度,CRF层可能需要使用现有的实现,比如pytorch-crf库。 训练过程中,需要定义损失函数和优化器。CRF的损失计算涉及转移矩阵和发射分数,所以需要专门的损失函数。评估指标通常用F1值,特别是对实体级别的准确率。 可能遇到的问题包括OOM(内存不足),这时候需要减小批次大小或者使用梯度累积。标签对齐也是一个常见问题,特别是在处理子词时,需要确保每个子词都有正确的标签。此外,学习率的设置可能需要调整,因为BERT部分通常需要较小的学习率,而顶层层可以用较大的。 用户可能还想知道如何优化模型,比如使用不同的预训练模型,调整BiLSTM的层数或隐藏单元数,或者加入Dropout防止过拟合。另外,如何部署模型或进行推理也是后续可能的问题。 需要确保回答中提到的代码示例正确,比如引用中的关键代码,例如构建BERT模型、添加BiLSTM层和CRF层。同时,要提醒用户安装必要的库,如transformers、torch和pytorch-crf。 最后,生成相关问题时,要考虑用户可能进一步的疑问,比如如何提升模型效果、处理中文数据、标签冲突或优化推理速度等。这些问题可以帮助用户深入理解模型的不同方面。</think>### 逐步说明:使用 BERT-BiLSTM-CRF 实现 NER #### 1. **核心组件作用** - **BERT**:生成上下文相关的词向量,替代传统静态词嵌入[^3] - **BiLSTM**:捕捉双向序列依赖,学习上下文特征 - **CRF**:建模标签转移约束(如"B-PER"后应为"I-PER"而非"O") #### 2. **实现步骤** ##### 2.1 数据准备 - 使用标准数据集(如CoNLL-2003/MSRA) - 预处理格式示例: ```text 华 B-ORG 为 I-ORG 总 O 部 O 位 B-LOC 于 I-LOC 深 B-LOC 圳 I-LOC ``` ##### 2.2 模型构建(PyTorch示例) ```python import torch from transformers import BertModel from torch import nn from torchcrf import CRF class BertBiLSTMCRF(nn.Module): def __init__(self, bert_path, num_labels, lstm_hidden_size=256): super().__init__() self.bert = BertModel.from_pretrained(bert_path) self.bilstm = nn.LSTM( input_size=self.bert.config.hidden_size, hidden_size=lstm_hidden_size, bidirectional=True, batch_first=True ) self.classifier = nn.Linear(2*lstm_hidden_size, num_labels) self.crf = CRF(num_labels, batch_first=True) def forward(self, input_ids, attention_mask, labels=None): # BERT编码 outputs = self.bert(input_ids, attention_mask=attention_mask) sequence_output = outputs.last_hidden_state # BiLSTM特征提取 lstm_out, _ = self.bilstm(sequence_output) # 标签预测 emissions = self.classifier(lstm_out) # CRF解码 if labels is not None: loss = -self.crf(emissions, labels, mask=attention_mask.bool()) return loss else: return self.crf.decode(emissions, mask=attention_mask.bool()) ``` ##### 2.3 关键实现细节 - **BERT输出处理**:取最后一层隐藏状态`last_hidden_state` - **标签对齐**:BERT的WordPiece分词可能导致token与标签长度不一致,需特殊处理[^3] - **CRF约束**:定义合法标签转移矩阵(如禁止"O"→"I-PER") #### 3. 训练与评估 ```python from transformers import BertTokenizerFast from torch.utils.data import DataLoader # 数据加载示例 tokenizer = BertTokenizerFast.from_pretrained("bert-base-chinese") dataset = NERDataset(texts, labels, tokenizer, max_len=128) dataloader = DataLoader(dataset, batch_size=32, shuffle=True) # 训练循环 optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5) for epoch in range(10): for batch in dataloader: loss = model(**batch) loss.backward() optimizer.step() optimizer.zero_grad() ``` #### 4. 常见问题解决 - **显存不足**:减小`batch_size`或使用梯度累积 - **标签冲突**:检查CRF转移矩阵约束规则 - **中文NER优化**:使用`bert-base-chinese`预训练模型 ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值