Python: TaggedCorpusReader 如何从 STTS 到通用标签集
Python: TaggedCorpusReader how to get from a STTS to a Universal tagset
我正在使用 Python 和 Keras 开发词性标注器。我得到的数据是使用 STTS 标签,但我应该为通用标签集创建一个标签器。所以我需要翻译这个。
首先我想到制作一个字典并简单地搜索替换标签,但后来我看到了使用 TaggedCorpusReader 设置标签集的选项。 (例如 'brown')
但我错过了可以在那里使用的可能标签集的列表。我可以以某种方式使用 STTS 标签集还是必须自己制作字典?
示例来源:
代码#3:将语料库标签映射到通用标签集
https://www.geeksforgeeks.org/nlp-customization-using-tagged-corpus-reader/
corpus = TaggedCorpusReader(filePath, "standard_pos_tagged.txt", tagset='STTS') #?? doesn't work sadly
# ....
trainingCorpus.tagged_sents(tagset='universal')[1]
最后看起来像这样:(非常感谢alexis)
with open(resultFileName, "w") as output:
for sent in stts_corpus.tagged_sents():
for word, tag in sent:
try:
newTag = mapping_dict[tag];
output.write(word+"/"+newTag+" ")
except:
print("except " + str(word) + " - " + str(tag))
output.write("\n")
只需创建一个字典并替换标签,就像您考虑的那样。 nltk 的通用标签集支持由模块 nltk/tag/mapping.py
提供。它依赖于一组映射文件,您可以在 NLTK_DATA/taggers/universal_tagset
中找到这些文件。例如,在 en-brown.map
中,您会发现这样的行,它将一大堆标签映射到 PRT
、ABX
到 DET
,等等:
ABL PRT
ABN PRT
ABN-HL PRT
ABN-NC PRT
ABN-TL PRT
ABX DET
AP ADJ
这些文件被读入用于翻译的词典中。通过创建相同格式的映射文件,您可以使用 nltk 的函数来执行翻译,但老实说,如果您的任务只是生成通用格式的语料库,我会手工进行翻译。但不是通过 "search-replace":使用 nltk 的语料库 readers 提供的元组,并通过在映射字典中直接查找来替换 POS 标签。
假设您知道如何说服 nltk TaggedCorpusReader
阅读您的语料库,并且您现在有一个 stts_corpus
reader 对象,其方法为 tagged_words()
、tagged_sents()
,等。还需要映射字典,其键为STTS标签,值为通用标签;如果 ABL
是一个 STTS 标签,mapping_dict["ABL"]
应该 return 值 PRT
。然后你的重新映射是这样的:
for filename in stts_corpus.fileids():
with open("new_dir/"+filename, "w") as output:
for word, tag in stts_corpus.tagged_words():
output.write(word+"/"+mapping_dict[tag]+" ")
output.write("\n")
这就是全部内容,除非您想添加一些奢侈品,例如将文本分成几行。
我正在使用 Python 和 Keras 开发词性标注器。我得到的数据是使用 STTS 标签,但我应该为通用标签集创建一个标签器。所以我需要翻译这个。
首先我想到制作一个字典并简单地搜索替换标签,但后来我看到了使用 TaggedCorpusReader 设置标签集的选项。 (例如 'brown')
但我错过了可以在那里使用的可能标签集的列表。我可以以某种方式使用 STTS 标签集还是必须自己制作字典?
示例来源: 代码#3:将语料库标签映射到通用标签集 https://www.geeksforgeeks.org/nlp-customization-using-tagged-corpus-reader/
corpus = TaggedCorpusReader(filePath, "standard_pos_tagged.txt", tagset='STTS') #?? doesn't work sadly
# ....
trainingCorpus.tagged_sents(tagset='universal')[1]
最后看起来像这样:(非常感谢alexis)
with open(resultFileName, "w") as output:
for sent in stts_corpus.tagged_sents():
for word, tag in sent:
try:
newTag = mapping_dict[tag];
output.write(word+"/"+newTag+" ")
except:
print("except " + str(word) + " - " + str(tag))
output.write("\n")
只需创建一个字典并替换标签,就像您考虑的那样。 nltk 的通用标签集支持由模块 nltk/tag/mapping.py
提供。它依赖于一组映射文件,您可以在 NLTK_DATA/taggers/universal_tagset
中找到这些文件。例如,在 en-brown.map
中,您会发现这样的行,它将一大堆标签映射到 PRT
、ABX
到 DET
,等等:
ABL PRT
ABN PRT
ABN-HL PRT
ABN-NC PRT
ABN-TL PRT
ABX DET
AP ADJ
这些文件被读入用于翻译的词典中。通过创建相同格式的映射文件,您可以使用 nltk 的函数来执行翻译,但老实说,如果您的任务只是生成通用格式的语料库,我会手工进行翻译。但不是通过 "search-replace":使用 nltk 的语料库 readers 提供的元组,并通过在映射字典中直接查找来替换 POS 标签。
假设您知道如何说服 nltk TaggedCorpusReader
阅读您的语料库,并且您现在有一个 stts_corpus
reader 对象,其方法为 tagged_words()
、tagged_sents()
,等。还需要映射字典,其键为STTS标签,值为通用标签;如果 ABL
是一个 STTS 标签,mapping_dict["ABL"]
应该 return 值 PRT
。然后你的重新映射是这样的:
for filename in stts_corpus.fileids():
with open("new_dir/"+filename, "w") as output:
for word, tag in stts_corpus.tagged_words():
output.write(word+"/"+mapping_dict[tag]+" ")
output.write("\n")
这就是全部内容,除非您想添加一些奢侈品,例如将文本分成几行。