如何解决NLTagger:一次通过枚举多种类型的标签
使用NLTagger类,我想知道是否有人可以推荐一种最简单的方法来枚举给定文本中的标记标记,但是每个标记会提取出多种标记类型。例如,要枚举给定文本中的单词,请为每个单词拉出(引理,词汇类别)。
似乎enumerateTags()方法和关联的NLTag类具有每个枚举仅报告一种特定标签类型的限制。因此,我可以通过对文本进行多次传递来实现自己想要的目标,例如在第一遍通过匹配给定条件的字符串范围,然后在后续遍通过匹配。例如,我可以这样对所有名词和动词进行去词化:
let tagger = NLTagger(tagSchemes: [.lemma,.nameTypeOrLexicalClass])
tagger.string = //some text
let keyWordCategories: [NLTag] = [.noun,.verb]
let options: NLTagger.Options = [.omitPunctuation,.omitWhitespace,.joinNames]
// In the first pass,we're going to record which ranges are of categories we're interested in
var keywordRanges = Set<Range<String.Index>>(minimumCapacity: 200)
// First pass: which are the nouns and verbs?
tagger.enumerateTags(in: text.startIndex..<text.endIndex,unit: .word,scheme: .nameTypeOrLexicalClass,options: options) { tag,tokenRange in
if let tag = tag {
if (keyWordCategories.contains(tag)) {
keywordRanges.insert(tokenRange)
}
}
return true
}
// Second pass: lemmatise,filtering on just the nouns and verbs
tagger.enumerateTags(in: text.startIndex..<text.endIndex,scheme: .lemma,tokenRange in
if let tag = tag {
if (keywordRanges.contains(tokenRange)) {
lemmas.insert(tag.rawValue)
}
}
return true
}
此机制实现了所需的功能,但令我震惊的是,这种笨拙且效率低下的处理方法。我希望能够一次通过枚举(引理,词汇类别)。我假设NLTagger实例在后台缓存事物,因此就效率而言,它并不像看上去那样糟糕。但是就代码的简单性而言,它仍然远非理想。谁能更熟悉此API,请问这是否真的是预期的模式?
解决方法
您可以使用tags(in:unit:scheme:options:)来获得具体范围内的引理,而不必遍历标记程序的每个引理:
"''"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。