为 SpaCy NER 格式化训练数据集
Formatting training dataset for SpaCy NER
我想用我自己的实体为 NER 训练一个空白模型。为此,我需要使用一个数据集,该数据集当前为 .csv 格式并具有以下格式的实体标签(我将为每个相关列提供一个示例行):
列:句子
值:我要苹果
列:数据
值:['want;@command;2;6','apples';@fruit;7;13']
列:实体
值:我@command @fruit
列:entity_types
值:@bot/@command;@bot/@food/@fruit
为了训练 SpaCy 的 NER,我需要以下形式的 json 训练数据:
TRAIN_DATA = [
('Who is Shaka Khan?', {
'entities': [(7, 17, 'PERSON')]
}),
('I like London and Berlin.', {
'entities': [(7, 13, 'LOC'), (18, 24, 'LOC')]
})
]
Link to the relevant part in the SpaCy Docs
我试图找到一个解决方案来解决如何将 csv 中的数据重新格式化为 SpaCy 所需的格式,但到目前为止我还没有成功。数据集确实包含所有必要的信息——文本字符串、实体名称、实体类型、实体偏移量——但我只是不知道如何以正确的形式获取它们。
我将不胜感激有关如何完成此任务的所有帮助!
从您的问题中不能 100% 清楚您是否也在询问 CSV 提取 - 所以我假设这不是问题所在。 (如果是,使用 csv
模块应该很容易实现。如果 CSV 数据很乱并且包含一堆组合在一个字符串中的东西,您可能需要调用 split
并以骇人听闻的方式进行。)
如果您能够以这样的格式提取 "sentence" 和 "data" 列,那么您实际上已经非常接近 spaCy 的训练格式了:
[{
'sentence': 'I want apples'
'data': [('want', '@command', 2, 6) ('apples', '@fruit', 7, 13)]
}]
与 spaCy 相比,您的数据似乎以不同的方式计算结束字符,并且具有 +1
的偏移量。所以你必须通过减去 1
来调整它。我可能把它写得比它应该的更冗长,但我希望这能让它更容易理解:
TRAIN_DATA = []
for example in your_extracted_data: # see example above
entities = []
for entity in example['data']: # iterate over the entities
text, label, start, end = entity # ('want', '@command', 2, 6)
label = label.split('@')[1].upper() # not necessary, but nicer
end = end - 1 # correct the end character index
entities.append((start, end, label))
# add training example of (text, annotations) tuple
TRAIN_DATA.append((example['sentence'], {'entities': entities}))
这应该会为您提供如下所示的训练数据:
[
('I want apples', {'entities': [(2, 5, 'COMMAND'), (7, 12, 'FRUIT')]})
]
我想用我自己的实体为 NER 训练一个空白模型。为此,我需要使用一个数据集,该数据集当前为 .csv 格式并具有以下格式的实体标签(我将为每个相关列提供一个示例行):
列:句子
值:我要苹果
列:数据
值:['want;@command;2;6','apples';@fruit;7;13']
列:实体
值:我@command @fruit
列:entity_types
值:@bot/@command;@bot/@food/@fruit
为了训练 SpaCy 的 NER,我需要以下形式的 json 训练数据:
TRAIN_DATA = [
('Who is Shaka Khan?', {
'entities': [(7, 17, 'PERSON')]
}),
('I like London and Berlin.', {
'entities': [(7, 13, 'LOC'), (18, 24, 'LOC')]
})
]
Link to the relevant part in the SpaCy Docs
我试图找到一个解决方案来解决如何将 csv 中的数据重新格式化为 SpaCy 所需的格式,但到目前为止我还没有成功。数据集确实包含所有必要的信息——文本字符串、实体名称、实体类型、实体偏移量——但我只是不知道如何以正确的形式获取它们。
我将不胜感激有关如何完成此任务的所有帮助!
从您的问题中不能 100% 清楚您是否也在询问 CSV 提取 - 所以我假设这不是问题所在。 (如果是,使用 csv
模块应该很容易实现。如果 CSV 数据很乱并且包含一堆组合在一个字符串中的东西,您可能需要调用 split
并以骇人听闻的方式进行。)
如果您能够以这样的格式提取 "sentence" 和 "data" 列,那么您实际上已经非常接近 spaCy 的训练格式了:
[{
'sentence': 'I want apples'
'data': [('want', '@command', 2, 6) ('apples', '@fruit', 7, 13)]
}]
与 spaCy 相比,您的数据似乎以不同的方式计算结束字符,并且具有 +1
的偏移量。所以你必须通过减去 1
来调整它。我可能把它写得比它应该的更冗长,但我希望这能让它更容易理解:
TRAIN_DATA = []
for example in your_extracted_data: # see example above
entities = []
for entity in example['data']: # iterate over the entities
text, label, start, end = entity # ('want', '@command', 2, 6)
label = label.split('@')[1].upper() # not necessary, but nicer
end = end - 1 # correct the end character index
entities.append((start, end, label))
# add training example of (text, annotations) tuple
TRAIN_DATA.append((example['sentence'], {'entities': entities}))
这应该会为您提供如下所示的训练数据:
[
('I want apples', {'entities': [(2, 5, 'COMMAND'), (7, 12, 'FRUIT')]})
]