我使用 nltk 进行词性标注。它有 36 个 Penn Treebank。我想将标签的数量减少到6个:“名词、动词、形容词、副词、介词、连词”我该怎么做?有没有具体的功能属性?还是命令?
4 回答
我建议您使用该tagset_mapping
方法。如果您要求它从en-ptb
(Penn Treebank PoS)映射到universal
您将减少 PoS 标签的数量。
这是一个非常简单的示例,可以查看如何合并该方法:
from nltk.tokenize import word_tokenize
from nltk import pos_tag
from nltk.tag.mapping import tagset_mapping
PTB_UNIVERSAL_MAP = tagset_mapping('en-ptb', 'universal')
def to_universal(tagged_words):
return [(word, PTB_UNIVERSAL_MAP[tag]) for word, tag in tagged_words]
text = "This is a very simple example."
pos_tagged = [(word, tag) for word, tag in pos_tag(word_tokenize(text))]
您可以观察映射前后的差异:
print(pos_tagged)
>>>[('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('very', 'RB'), ('simple', 'JJ'), ('example', 'NN'), ('.', '.')]
print(to_universal(pos_tagged))
>>> [('This', 'DET'), ('is', 'VERB'), ('a', 'DET'), ('very', 'ADV'), ('simple', 'ADJ'), ('example', 'NOUN'), ('.', '.')]
我建议你坚持这个映射,即使结果标签比预期的要多。这样,您将遵循某种“约定”。此外,“额外”标签主要是关于标点符号。
如果你严格地想映射到你的固定集合“名词、动词、形容词、副词、介词、连词”,你总是可以使用map_tag方法。
请注意,您可能需要下载额外的资源:
import nltk
nltk.download('universal_tagset')
询问“通用”标签集:
treebank.tagged_sents(tagset="universal")
它并不完全是您指定的列表(例如,它没有忘记确定器),但它很接近。如果您仍然不喜欢它,您可以自己重命名其余的 POS 标签。
UPenn 标记集文档可以这样访问:
>>> import nltk
>>> nltk.help.upenn_tagset()
NLTK 的所有可能的 pos 标签是什么?有一个很好的详细讨论/描述。
wsj
请注意,虽然Penn Treebank (PTB)的华尔街日报 ( ) 子集使用 UPenn 标签集,但brown
语料库(PTB 的子集)具有更细粒度的标签集:
>>> nltk.help.brown_tagset()
虽然原始 PTB 有upenn
和brown
标签,但treebank
语料库中的标签是可以映射的。正如@alexis 所示,PTB 语料库的通用标签集可以这样访问:
treebank.tagged_sents(tagset="universal")
它们通过使用文件中的映射资源映射到通用标记集:nltk.tag.mapping.tagset_mapping
nltk_data/taggers/universal_tagset/en-*.map
~/nltk_data/taggers/universal_tagset$ ls
README de-negra.map en-tweet.map fi-tdt.map ja-verbmobil.map sl-sdt.map
ar-padt.map de-tiger.map es-cast3lb.map fr-paris.map ko-sejong.map sv-talbanken.map
bg-btb.map el-gdt.map es-eagles.map hu-szeged.map nl-alpino.map tu-metusbanci.map
ca-cat3lb.map en-brown.map es-iula.map it-isst.map pl-ipipan.map universal_tags.py
cs-pdt.map en-ptb.map es-treetagger.map iw-mila.map pt-bosque.map zh-ctb6.map
da-ddt.map en-tweet.README eu-eus3lb.map ja-kyoto.map ru-rnc.map zh-sinica.map
您不能减少到这 6 个标签,因为诸如限定词或代词之类的事物将有一个“其他”类别,不能直接减少到您提到的任何类别。
话虽如此,简短的回答是:
- 查看此链接以获取 HTML 中的映射表
- 这确实会为您在语言注释本体中的特定减少执行实时查找 (请参阅解释中的长答案)
- 要直接在 NLTK 中使用该映射,请将 JSON 定义为输出格式并将其解析为 Python 字典,如通过此链接
长答案:
要将标签减少到您的“目标标签”,您可以使用 Ontologies of Linguistic Annotation [披露:我正在维护这些],并使用以下 SPARQL 查询:
PREFIX system: <http://purl.org/olia/system.owl#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX olia: <http://purl.org/olia/olia.owl#> # columns of the mapping table SELECT distinct ?tag ?category # lookup in the Ontologies of Linguistic Annotation FROM <http://purl.org/olia/penn.owl> # Penn tags FROM <http://purl.org/olia/olia.owl> # reference concepts (Noun etc.) FROM <http://purl.org/olia/penn-link.rdf> # Penn -> reference concepts # the actual query WHERE { # for an element with a particular tag ?a system:hasTag ?tag. # retrieve all its super classes OPTIONAL { ?a a/(rdfs:subClassOf|owl:equivalentClass| owl:unionOf|owl:intersectionOf)* ?b. # but only if they match your target categories # see http://purl.org/olia/olia.owl for their definitions FILTER(?b in ( olia:Noun, olia:Verb, olia:Adjective, olia:Adverb, olia:Preposition, olia:Conjunction )) } # return the local name of the target category # if none of your target categories can be found, return "OTHER" BIND(if(bound(?b), replace(str(?b),".*[#/]",""), "OTHER") AS ?category) } ORDER BY ?tag
有关解释,请参阅内联注释。您可以调整过滤条件以获得更多、更少或其他类别。请注意,如果 Penn 标记不明确(析取,即
owl:unionOf
),则此查询可以返回多个映射。无需为此类偶尔查询设置自己的端点,只需访问 http://sparql.org/sparql.html并复制并粘贴(和编辑)该查询。可以使用不同的输出格式,选择“输出 XML”和默认的 XSL 样式表以获得 HTML 视图。
整个查询可以压缩成一个 URI(如上)。您可以自定义查询和输出格式,单击“获取结果”并复制结果页面的 URL。(或者自己构建,使用标准的 URI 转义。)
请注意,每当您单击该链接时,都会运行实时查询。最好这样做一次并存储您的映射表。
请注意,复杂表达式
(rdfs:subClassOf|owl:equivalentClass| owl:unionOf|owl:intersectionOf)*
允许您搜索 OWL 公理。但是,这是搜索,而不是推理,因此您只会检索明确定义为超类的类。注意
owl:unionOf
是逻辑或。没有办法通过 SPARQL 查询来消除歧义,如果您想将具有歧义定义的标签视为OTHER
,请从属性路径中删除该表达式。另请注意,这不仅限于 Penn,OLiA 支持 100 多种语言的标签集,请参阅http://purl.org/olia