基于CoNLL2003创建自定义数据集



我正在研究一个命名实体识别(NER)项目,并希望基于CoNLL2003数据集(链接:https://huggingface.co/datasets/conll2003)创建自己的数据集。我一直在查看CoNLL2003数据,我很难理解块列是如何标记的。我不确定它是基于词性(POS)标签还是基于其他东西。理想情况下,我希望自动化为自定义数据集创建块标签的过程,而不是手动进行。有人能解释一下如何在CoNLL2003中标记块列,并提供一些指导,告诉我如何通过编程为我自己的数据集生成相同的标签吗?

为了解释更多,让我们取数据集的第一行并尝试处理它,我应该有相同的结果。

数据集的第一句话,即:EU rejects German call to boycott British lamb.

  • 在python上这样做:
# import libraries and modules needed for the project
import pandas as pd
import nltk
from nltk.tokenize import word_tokenize
from nltk import pos_tag, ne_chunk
import re
# We take the first sentence from the dataset conll2003
Sentence = "EU rejects German call to boycott British lamb."

同一句子的标记为:['EU', 'rejects', 'German', 'call', 'to', 'boycott', 'British', 'lamb', '.']

  • 在python上这样做:
import pandas as pd
import nltk
from nltk.tokenize import word_tokenize
from nltk import pos_tag, ne_chunk
import re
# Tokenize the sentence
tokens = word_tokenize(Sentence)
# Print the tokens
print(tokens)

同一句的词性为:['NNP', 'VBZ', 'JJ', 'NN', 'TO', 'VB','JJ', 'NN', '.'][22, 42, 16, 21, 35, 37, 16, 21, 7]

  • 在python上这样做:
pos_tags = {'"': 0, "''": 1, '#': 2, '$': 3, '(': 4, ')': 5, ',': 6, '.': 7, ':': 8, '``': 9, 'CC': 10, 'CD': 11, 'DT': 12, 'EX': 13, 'FW': 14, 'IN': 15, 'JJ': 16, 'JJR': 17, 'JJS': 18, 'LS': 19, 'MD': 20, 'NN': 21, 'NNP': 22, 'NNPS': 23, 'NNS': 24, 'NN|SYM': 25, 'PDT': 26, 'POS': 27, 'PRP': 28, 'PRP$': 29, 'RB': 30, 'RBR': 31, 'RBS': 32, 'RP': 33, 'SYM': 34, 'TO': 35, 'UH': 36, 'VB': 37, 'VBD': 38, 'VBG': 39, 'VBN': 40, 'VBP': 41, 'VBZ': 42, 'WDT': 43, 'WP': 44, 'WP$': 45, 'WRB': 46}
# POS Tagging of the tokens
pos_tagged = pos_tag(tokens)
# Print the POS Tagged tokens
print(pos_tagged)
# Keep only the POS tags in a list
pos_tags_only = [pos_tags[tag] for word, tag in pos_tagged]
# Print the POS
print(pos_tags_only)

同一句子的块标签应该是:['B-NP', 'B-VP', 'B-NP', 'I-NP', 'B-VP', 'I-VP','B-NP', 'I-NP', 'O'],这是[11, 21, 11, 12, 21, 22, 11, 12, 0],但他们是如何做到的,我不知道我已经测试了一个代码,但我没有得到与这个['B-NP', 'B-VP', 'B-NP', 'I-NP', 'B-VP', 'I-VP','B-NP', 'I-NP', 'O']完全相同的结果如果有人知道他们是怎么做的,请指导我。

# To start with, this is the chunk tag set used in conll2003 dataset
chunk_tags = {'O': 0, 'B-ADJP': 1, 'I-ADJP': 2, 'B-ADVP': 3, 'I-ADVP': 4, 'B-CONJP': 5, 'I-CONJP': 6, 'B-INTJ': 7, 'I-INTJ': 8, 'B-LST': 9, 'I-LST': 10, 'B-NP': 11, 'I-NP': 12, 'B-PP': 13, 'I-PP': 14, 'B-PRT': 15, 'I-PRT': 16, 'B-SBAR': 17, 'I-SBAR': 18, 'B-UCP': 19, 'I-UCP': 20, 'B-VP': 21, 'I-VP': 22}  

分块是NLP中的一个过程,它与词性标注(POS)一起工作,形成聚类词块,这些词在进行文本处理时应该一起考虑。这对命名实体识别(NER)很有帮助。例如,令牌JohnSmith都是NN-名。然而,出于处理目的,John Smith应被视为。类似地,123 Some Street-每个令牌将有一个不同的POS标记,但这些令牌应被视为一个,因为它们形成了一个地址。

这是一个过于简单的解释,但我希望这是一个有用的"立足点"。切题。

不同的模块将chunk不同-所以你会得到不同的结果基于你使用的分块函数或分块模块。

Nikita Bachani在Medium上的这篇文章是对这个话题的一个很好的介绍。

相关内容

  • 没有找到相关文章

最新更新