【问题标题】:Python: TaggedCorpusReader how to get from a STTS to a Universal tagsetPython:TaggedCorpusReader 如何从 STTS 获取通用标签集
【发布时间】:2019-05-04 16:19:30
【问题描述】:

我正在使用 Python 和 Keras 开发 POS 标记器。我得到的数据是使用 STTS 标签,但我应该为通用标签集创建一个标签器。所以我需要翻译这个。

首先我想制作一个字典并简单地搜索替换标签,但后来我看到了使用 TaggedCorpusReader 设置标签集的选项。 (例如“棕色”)

但我错过了可以在那里使用的可能的标签集列表。我可以以某种方式使用 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")

【问题讨论】:

    标签: python keras nlp nltk pos-tagger


    【解决方案1】:

    只需创建一个字典并替换标签,就像您考虑的那样。 nltk 的通用标签集支持由模块nltk/tag/mapping.py 提供。它依赖于一组映射文件,您可以在NLTK_DATA/taggers/universal_tagset 中找到这些文件。例如,在en-brown.map 中,您会发现这样的行,将一大堆标签映射到PRTABXDET,等等:

    ABL     PRT
    ABN     PRT
    ABN-HL  PRT
    ABN-NC  PRT
    ABN-TL  PRT
    ABX     DET
    AP      ADJ
    

    这些文件被读入用于翻译的字典中。通过创建相同格式的映射文件,您可以使用 nltk 的函数来执行翻译,但老实说,如果您的任务只是生成通用格式的语料库,我只会手动进行翻译。但不是通过“搜索替换”:使用 nltk 的语料库阅读器提供的元组,只需通过在映射字典中直接查找来替换 POS 标签。

    假设您知道如何说服 nltk TaggedCorpusReader 读取您的语料库,并且您现在有一个带有 tagged_words()tagged_sents() 等方法的 stts_corpus 阅读器对象。您还需要映射字典,其键是 STTS 标记,值是通用标记;如果ABL 是一个STTS 标签,mapping_dict["ABL"] 应该返回值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")
    

    这就是它的全部内容,除非您想添加诸如将文本分成几行之类的奢侈品。

    【讨论】:

    • 完美运行。虽然我不得不使用豪华的新线:)
    • 为了记录,换行有两种简单的方法: a) 循环 tagged_sents() 并在每个句子后输出一个换行;或 b) 将输出收集到一个字符串中,并在写入文件之前通过textrwrap.fill() 运行它。
    • 我选择了第一个。循环遍历 tagged_sents 中的每个元组并在末尾添加一个换行符。但第二个对我来说是新的。感谢您的输入
    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2016-01-09
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多