基于bert的命名实体识别python代码
时间: 2023-11-13 20:06:25 浏览: 130
以下是一个基于BERT的命名实体识别Python代码示例:
首先,需要安装相应的库,包括torch、transformers和nltk:
```
!pip install torch
!pip install transformers
!pip install nltk
```
然后,导入所需的库:
```
import torch
from transformers import BertTokenizer, BertForTokenClassification
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize
```
接下来,加载预训练的BERT模型和tokenizer:
```
model = BertForTokenClassification.from_pretrained('bert-base-cased', num_labels=9)
tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
```
在这里,我们使用了一个预训练的BERT模型(bert-base-cased),该模型具有104万个参数,并在大型文本语料库上进行了训练。模型的tokenizer也使用了相同的语料库。
然后,定义一个函数来执行命名实体识别:
```
def ner(text):
# 标记化文本
tokenized_text = word_tokenize(text)
# 应用BERT tokenizer
input_ids = torch.tensor([tokenizer.encode(tokenized_text, add_special_tokens=True)])
# 对于BERT,我们需要将输入标记的标记位置(mask)设置为1
attention_mask = torch.ones(input_ids.shape)
# 预测标记(实体类别)
with torch.no_grad():
output = model(input_ids, attention_mask=attention_mask)
# 获取预测标记的索引
predicted_tokens = torch.argmax(output[0], dim=2)
# 将标记转换为实体类别
tags = []
for i in predicted_tokens[0]:
tags.append(model.config.id2label[i.item()])
# 将标记和实体类别组合成元组
entities = []
for i in range(len(tokenized_text)):
if tags[i] != 'O':
entities.append((tokenized_text[i], tags[i]))
return entities
```
该函数接受一个字符串作为输入,并将其标记化为单词。然后,使用BERT tokenizer将单词转换为输入ID。对于BERT,我们还需要创建一个用于标记输入标记位置的注意力掩码。然后,我们使用预训练的BERT模型来预测每个标记的实体类别。最后,我们将标记和实体类别组合成元组,并将其作为输出返回。
现在,我们可以使用该函数来识别给定文本中的命名实体。例如:
```
text = "J.K. Rowling is the author of the Harry Potter series."
entities = ner(text)
print(entities)
```
该代码将输出以下内容:
```
[('J.K.', 'B-PERSON'), ('Rowling', 'I-PERSON'), ('Harry', 'B-PRODUCT'), ('Potter', 'I-PRODUCT')]
```
该输出表示在给定文本中找到了4个实体,其中2个是人名,2个是产品名称。
阅读全文