首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NSLinguisticTagger识别人名

用NSLinguisticTagger识别人名
EN

Stack Overflow用户
提问于 2014-09-19 19:07:16
回答 1查看 1.3K关注 0票数 4

我在摆弄NSLinguisticTagger.

识别像名词、动词、介词这样的基本词类型非常有效。

然而,对人名NSLinguisticTagPersonalName的识别在我的测试(iOS8)中几乎行不通。places似乎也运行得很好,但是大多数情况下,人名也被归类为Places。

下面是我的基本设置(使用NSLinguisticTagSchemeNameTypeOrLexicalClass)

代码语言:javascript
复制
    var tagger:NSLinguisticTagger = NSLinguisticTagger(tagSchemes: NSLinguisticTagger.availableTagSchemesForLanguage("en") , options: 3)
    tagger.string = entryString
    tagger.enumerateTagsInRange(NSMakeRange(0, entryString.length), scheme: NSLinguisticTagSchemeNameTypeOrLexicalClass, options: (NSLinguisticTaggerOptions.OmitWhitespace | NSLinguisticTaggerOptions.JoinNames), usingBlock: {
        tag,tokenRange,sentenceRange,_ in
        let token = entryString.substringWithRange(tokenRange)
        println("[\(tag)] \(token) \(tokenRange)")

示例1

代码语言:javascript
复制
 "Meeting with John in Paris"

  Evaluation

 [Verb] Meeting
 [Preposition] with
 [Noun] John
 [Preposition] in
 [PlaceName] Paris

示例2

代码语言:javascript
复制
 "Meeting with John"

  Evaluation

 [Verb] Meeting (0,7)
 [Preposition] with (8,4)
 [PlaceName] John (13,4)

知道我怎么才能改进人名的匹配吗?

另外,我很想知道一个名字需要如何被识别。(我认为像"with“这样的介词是一个很好的指示词…显然这还不够)。对此,我希望有任何想法或更多的见解。这是一个令人兴奋的领域。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-15 21:01:09

显然正确的答案是:“等几年,苹果才能改进Swift 4中的improve。”

以下是在Xcode 9(Beta)中编写和执行的Swift 4代码:

代码语言:javascript
复制
let entryString = "Meeting with John"

let schemes = NSLinguisticTagger.availableTagSchemes(forLanguage: "en")
let options: NSLinguisticTagger.Options = [
    .omitWhitespace, .omitPunctuation, .joinNames
]

let tagger = NSLinguisticTagger(tagSchemes: schemes, options: Int(options.rawValue))
tagger.string = entryString

let rangeOfEntireEntryString = NSRange(location: 0, length: entryString.utf16.count)

tagger.enumerateTags(
    in: rangeOfEntireEntryString,
    scheme: .nameTypeOrLexicalClass,
    options: options)
{ (tag, tokenRange, sentenceRange, _) in
    guard let tag = tag?.rawValue else { return }
    let token = (entryString as NSString).substring(with: tokenRange)
    print("[\(tag)] \(token) \(tokenRange)")
}

下面是第一个示例字符串的结果:

代码语言:javascript
复制
let entryString = "Meeting with John in Paris"

[Noun] Meeting {0, 7}
[Preposition] with {8, 4}
[PersonalName] John {13, 4}
[Preposition] in {18, 2}
[PlaceName] Paris {21, 5}

第二个示例字符串:

代码语言:javascript
复制
let entryString = "Meeting with John"

[Noun] Meeting {0, 7}
[Preposition] with {8, 4}
[PersonalName] John {13, 4}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25940798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档