Regex 如何标记命名实体以准备使用spacy进行自定义命名实体识别的训练数据?

Regex 如何标记命名实体以准备使用spacy进行自定义命名实体识别的训练数据?,regex,python-3.x,spacy,ner,Regex,Python 3.x,Spacy,Ner,我想在自定义数据集上训练spacy命名实体识别器。我已经准备了一个python字典,其中包含key=entity\u type和list of values=entity name,但是我没有找到任何方法来以正确的格式标记标记标记 我尝试了普通字符串匹配(find)和正则表达式(search,compile),但没有得到我想要的 举个例子:我的句子和我正在使用的口述是(这是一个例子) 您可以从dic中的所有值构建一个正则表达式,将它们作为整词进行匹配,并在匹配时抓取与匹配值关联的键。我假设值项在

我想在自定义数据集上训练spacy命名实体识别器。我已经准备了一个python字典,其中包含key=entity\u type和list of values=entity name,但是我没有找到任何方法来以正确的格式标记标记标记

我尝试了普通字符串匹配(find)和正则表达式(search,compile),但没有得到我想要的

举个例子:我的句子和我正在使用的口述是(这是一个例子)


您可以从
dic
中的所有值构建一个正则表达式,将它们作为整词进行匹配,并在匹配时抓取与匹配值关联的键。我假设值项在字典中是唯一的,它们可以包含空格,并且只包含“word”字符(没有像
+
)这样的特殊字符)


请参阅

您可以从您的
dic
中的所有值构建一个正则表达式,将它们作为完整的单词进行匹配,并在匹配后抓取与匹配值关联的键。我假设值项在字典中是唯一的,它们可以包含空格,并且只包含“word”字符(没有像
+
)这样的特殊字符)


查看

不懂python,但在检查句子之前,将内容转换为小写。在第一个大于-1的索引之后,打破循环,并使用索引和字符串长度构建一个结果对象。这样你应该得到你想要的结果感谢@Michael注释我想我试过了你想说的,但是没有如果我在同一个句子中有超过1或2个实体,也不起作用。我不懂python,但在检查句子之前,将内容转换为小写。在第一个大于-1的索引之后,打破循环,并使用索引和字符串长度构建一个结果对象。这样,你应该得到你想要的结果@Mic注释谢谢我想我试过你想说的话,但是如果我在同一个句子中有超过1个或2个实体,那也就不起作用了。谢谢“Wikter,这就是我希望你救我的一天。”DhavalVedekar高兴地为你工作。请考虑一下投票(参见)。在达到15个代表点之后,你就有权获得“谢谢”维克多,这是我希望你拯救我的一天。@ DhavalVedekar高兴地为你效劳。请在你达到15个代表点后,考虑一下投票。
sentence = "Machine learning and data mining often employ the same methods
and overlap significantly."

dic = {'MLDM': ['machine learning and data mining'], 'ML': ['machine learning'],
 'DM': ['data mining']}

for k,v in dic.items():
  for val in v:
    if val in sentence:
      print(k, val, sentence.index(val)) #right now I'm just printing 
#the key, val and starting index

output:
MLDM machine learning and data mining 0
ML machine learning 0
DM data mining 21

expected output: MLDM 0 32

so I can further prepare training data to train Spacy NER : 
[{"content":"machine learning and data mining often employ the same methods 
and overlap significantly.","entities":[[0,32,"MLDM"]]}
import re

sentence = "Machine learning and data mining often employ the same methods and overlap significantly."

dic = {'MLDM': ['machine learning and data mining'], 'ML': ['machine learning'],
 'DM': ['data mining']}

def get_key(val):
    for k,v in dic.items():
        if m.group().lower() in map(str.lower, v):
            return k
    return ''

# Flatten the lists in values and sort the list by length in descending order
l=sorted([v for x in dic.values() for v in x], key=len, reverse=True)
# Build the alternation based regex with \b to match each item as a whole word 
rx=r'\b(?:{})\b'.format("|".join(l))
for m in re.finditer(rx, sentence, re.I): # Search case insensitively
    key = get_key(m.group())
    if key:
        print("{} {}".format(key, m.start()))