【问题标题】:Creating NER model with Keras and Python使用 Keras 和 Python 创建 NER 模型
【发布时间】:2021-06-24 05:07:14
【问题描述】:

我已经制作了检测字符串值是地址、公司还是日期的 Keras 模型。我只使用了不同的公司名称、不同的日期共振峰和不同的街道地址进行培训。 所以我数据集中的每一行都有 1 到 5 个单词(有些单词可以是数字)。

对于预处理,我使用了矢量化器:

transformerVectoriser = ColumnTransformer(transformers=[('vector char', CountVectorizer(analyzer='char', ngram_range=(3, 6), max_features = 2000), 'text'),
                                                        ('vector word', CountVectorizer(analyzer='word', ngram_range=(1, 1), max_features = 4000), 'text')],
                                          remainder='passthrough') # Default is to drop untransformed columns


features = transformerVectoriser.fit_transform(features)

这是我的模型:

model = Sequential()
model.add(Dense(100, input_dim = features.shape[1], activation = 'relu')) # input layer requires input_dim param
model.add(Dense(200, activation = 'relu'))
model.add(Dense(100, activation = 'relu'))
model.add(Dense(50, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

我已经达到了 93% 的准确率。 是否可以使用该模型来检测较大文本中的字符串(地址、公司或日期)在哪里?我认为这种模型称为NER模型(命名实体识别)。

我的模型接受字符串输入并决定它是公司、个人还是地址。 字符串输入长度为 1-5 个字。

例如,如果我有文字:

text = "What do you think about Amazon and their customer policy?"

如何检测“Amazon”的开始索引和结束索引,或者如何从该文本中仅提取 Amazon? 所以要求的结果应该是:

start_index = 21
end_index = 27

或者:

result = {'company':'Amazon'}

或者例如如果输入是:

"My name is Don John and I work in Amazon Inc."

因此我想要:{"company": "Amazon Inc", "name": "Don John"}

我想使用我的模型从文本中提取特定实体,在本例中为公司、地址或日期。 基本上我需要某种基于 Keras 模型的location search,或者在大文本中搜索模式。

【问题讨论】:

  • 你试过什么?您是否正在寻找有关如何重用已训练模型的信息?你的 keras 模型在做什么?它的输入是什么?它的输出是什么?
  • 我的模型接受字符串输入并确定它是公司、个人还是地址。字符串输入为 1-5 个字长。我想输入更长的文本,例如 1000 字,并以文本或地址等方式获取公司的位置
  • 是什么阻止您输入超过 5 个单词的字符串?有错误吗?
  • 我可以添加 100000 个单词的字符串,但结果不会显示或列出该文本中的所有实体/单词/短语。例如,如果我输入句子“我的名字是 Don John,我在 Amazon Inc. 工作”,结果我想要:{"company": Amazon Inc, "name": Don John}
  • 你的意思是你训练的模型是一个分类器,输出输入是地址、公司或名称的概率?你想要一种方法将此模型应用于句子中的每个单词/n-gram 吗?

标签: python keras nlp


【解决方案1】:

你可以有两种方式:

  1. 使用您当前的型号。将您的长文本分成 3-5 个单词的块(可能有 1-2 个单词重叠),然后在每个块上运行您的分类器。当您将窗口移到文本上时,您将获得指示当前块是否包含您正在搜索的实体。这样,您将能够重建触发实体分类器的单词的索引。
  2. 训练你自己的NER。然后对于每个(子)单词,您将获得一个分类。这相对容易。使用 Huggingface 的 transformers 库。您可以将您的代码基于this post(他们训练土耳其语NER)。如果您无法访问 GPU,则可以免费使用 Google Colab。如果运行 Transformer 模型对您来说计算成本太高,您可以尝试使用 CRF 模型。它将提供稍低的性能,但应该更快。参考this example

要使用 BERT 训练您自己的 NER,您需要一个带标签的数据集。通常它是一组句子,其中每个单词都被标记(例如 ORG、PERSON 等)然后你标记你的句子 - 将文本转换为(子)单词。 Huggingface 库中也提供了分词器。

然后您在数据集上微调 BERT。这个过程被称为微调,因为 BERT 模型是对大量数据进行预训练的,并且您只针对您的任务对其进行调整。否则,这是一个常规的监督训练过程:您向模型显示一系列标记及其标签,并尝试最小化整体误差。因此,每个令牌都会获得一些标签。

在 BERT 模型系列的上下文中,NER 被视为令牌分类任务(与文本序列分类和范围检测相反)。通常基于 BERT 的 NER 表现非常好。这里还有一个post 在这个过程中。

【讨论】:

  • 如何训练自己的NER? PS你的链接失效了
  • 我尝试将文本拆分为 ngram,但我没有得到很好的结果。公司名称有时1个字有时4个字,地址和名称也是如此。
  • 我已经修复了链接。您可以使用pipelines 快​​速评估基于 BERT 的 NER。不到10行代码!他们的模型不包括日期识别,但您将了解您可以在数据集上实现什么以及它的工作速度。作为奖励,您不需要 GPU 进行推理(仅用于训练)
猜你喜欢
  • 1970-01-01
  • 2020-12-11
  • 2020-05-31
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多