我使用nltk进行部分语音标记。它有36 Penn Treebank。我想将标签数量减少到6:“名词,动词,形容词,副词,介词,连词” 我该怎么办?是否有任何特定的功能属性?还是命令?
答案 0 :(得分:0)
要求"通用"标签集:
treebank.tagged_sents(tagset="universal")
它不是你指定的列表(例如,它没有忘记确定者),但它接近了。如果你还不喜欢它,你可以自己重命名其余的POS标签。
答案 1 :(得分:0)
可以这样访问UPenn标记集文档:
>>> import nltk
>>> nltk.help.upenn_tagset()
What are all possible pos tags of NLTK?对其进行了详细的讨论/描述。
请注意,虽然Penn Treebank(PTB)的华尔街日报(wsj
)子集使用UPenn标记集,但brown
语料库(PTB的子集)具有更精细的谷物标记集:
>>> nltk.help.brown_tagset()
虽然原始PTB具有upenn
和brown
标记,但可以映射treebank
语料库中的标记。正如@alexis所示,PTB语料库的通用标记集可以这样访问:
treebank.tagged_sents(tagset="universal")
使用nltk_data/taggers/universal_tagset/en-*.map
文件中的映射资源,Universal Tagset将它们映射到nltk.tag.mapping.tagset_mapping
:
~/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
答案 2 :(得分:0)
我建议您使用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'), ('.', '.')]
我建议您坚持使用此映射,即使结果标记多于预期。这样你就可以遵循#34;惯例"。此外,"额外"标签主要是关于标点符号。
如果您严格要映射到固定集"名词,动词,形容词,副词,介词,连词"您始终可以使用map_tag方法。
请注意,您可能需要下载额外的资源:
import nltk
nltk.download('universal_tagset')
答案 3 :(得分:0)
您不能简化为这6个标签,因为对于诸如限定词或代词之类的事物,将有一个“其他”类别,而不能直接归为您提到的任何类别。
话虽如此,简短的答案是:
长答案:
要将标签减少到“目标标签”,可以通过以下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