iosML 专题IOS开发中的小知识点整理

iOS-NSLinguisticTagger苹果自带自然语言处理

2019-03-22  本文已影响213人  树下敲代码的超人

知 识 点 / 超 人


详细的自然语言处理要点原理会在下一篇文章详细说明。这里只单纯的记录下苹果自带的NSLinguisticTagger自然语言处理工具。
Apple的NLP优势:

使用案例:

    //需要进行处理的 自然语句
    //NSString * string = @"What is the weather in San Francisco?";
    NSString *string = @"我爸就是山东东阿阿胶胶厂厂长长孙孙山了";
    //NSString *string = @"我在四川成都?";
    //NSString *string = @"社会のセグメントは、その職務を遂行します";
    //步骤1.NSLinguisticTaggerOptions 设置自然语言筛选条件
    NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerJoinNames |NSLinguisticTaggerOmitPunctuation;
    
    //步骤2.通过设置 标签处理方案和语言 获取对应的方案枚举数组
    //只设置 自然语言的类型
    //NSArray *arr = [NSLinguisticTagger availableTagSchemesForLanguage:@"zh-Hans"];
    //设置 语言的处理方式和语言类型
    NSArray *arr = [NSLinguisticTagger availableTagSchemesForUnit:NSLinguisticTaggerUnitWord|NSLinguisticTaggerUnitDocument language:@"zh-Hans"];
    
    //步骤3.创建自然语言处理标签器 设置语言处理方案 和 筛选条件
    NSLinguisticTagger * tagger = [[NSLinguisticTagger alloc]initWithTagSchemes:arr options:options];
    //步骤4.给处理器器设置处理的字符串
    tagger.string = string;
    //步骤5.根据设置的字符串,获取字符串的语言类型,BCP-47
    NSString *language = tagger.dominantLanguage;
    NSLog(@"语言类型:%@",tagger.dominantLanguage);
    //步骤6.执行筛选的处理
    [tagger enumerateTagsInRange:NSMakeRange(0, string.length) scheme:NSLinguisticTagSchemeScript  options:options usingBlock:^(NSString * _Nonnull tag, NSRange tokenRange, NSRange sentenceRange, BOOL * _Nonnull stop) {
        
        //步骤7.根据返回数据  判断 获取 想要的结果
        
        NSString *token = [string substringWithRange:tokenRange];
        NSLog(@"==>%@:%@",token,tag);
    }];

步骤1说明: NSLinguisticTaggerOptions是一个自然语言标签筛选条件的枚举类型。主要是设置对内容文本的过滤组合方案

/*通过对NSLinguisticTaggerOptions 的设置选择,来指定内容的过滤组合方式 */
typedef NS_OPTIONS(NSUInteger, NSLinguisticTaggerOptions) {   /* Any combination of options from the enumeration. */
    NSLinguisticTaggerOmitWords, /* 忽略过滤掉所有单词 */
    NSLinguisticTaggerOmitPunctuation,/* 忽略过滤掉所有标点符号 */
    NSLinguisticTaggerOmitWhitespace,/* 忽略过滤掉所有空白 */
    NSLinguisticTaggerOmitOther,/* 忽略过滤掉所有其他,这里的其他指的是非选择的语言或特殊字符 */
    NSLinguisticTaggerJoinNames,/* 连接名称,把人名,地名,组织名等组合在一起 */
};

步骤2说明:设置处理方案和语言 通过NSLinguisticTagger类方法自动根据设置的内容匹配可以处理的方案。处理器将会按照设置的NSLinguisticTaggerUnit方案,分成单词、句子或段落级别来进行分析操作。主要是设置分析的具体方案。

/*
NSLinguisticTaggerUnit是用作标记字符串中单位的大小。
标记单位可以是单词、句子、段落或整个字符串。
不同的单位按照不同的方法级别执行。
并非所有方法和单位的组合都受支持;
可以使用+availableTagschemesforUnit:language:方法来设置。
*/
typedef NS_ENUM(NSInteger, NSLinguisticTaggerUnit) {
    NSLinguisticTaggerUnitWord,/* Token按照单词或类似单词的语言项为单位*/
    NSLinguisticTaggerUnitSentence,/* Token按照句子为单位*/
    NSLinguisticTaggerUnitParagraph,/* Token 按照段落为单位 */
    NSLinguisticTaggerUnitDocument,/* Token 按照整个字符串为单位*/
};

语言主要是遵循BCP-47

语言字符串 语言名称
zh-Hant 中文繁体
zh-Hans 中文简体
en 英文
ja 日文
//指定处理单元和语言
+ (NSArray<NSLinguisticTagScheme> *)availableTagSchemesForUnit:(NSLinguisticTaggerUnit)unit language:(NSString *)language


//只设置语言,使用默认的处理单元处理
+ (NSArray<NSLinguisticTagScheme> *)availableTagSchemesForLanguage:(NSString *)language

步骤3说明: NSLinguisticTagger是自然语言标记处理器,步骤1,2已经选定了处理器的规则。所以我们只需要创建一个处理器并把步骤1,2中的条件设置进去即可

步骤4说明:语言处理器已经创建并设置了条件。现在设置需要处理的内容文本。

步骤5说明:当步骤4设置了需要处理的内容文本后,NSLinguisticTagger处理器会自动根据文本来判断内容文本对应的语言,因为在步骤2中所设置的language不一定就是文本的真实类型。但是这个返回语言类型不一定准确,因为有时候中文简体,繁体,日文会出现混淆的情况

步骤6说明:根据选择的处理方案和响应的参数来执行 语言处理器。从处理器的block中得到处理结果。

/*
不指定处理单元的方式 自动处理内容文本
参数1 range:指定处理传入的内容文本在字符串中的范围
参数2 tagScheme:指定处理的分类方案
参数3 opts:指定筛选条件
参数4 block:处理后的结果返回的block
*/
- (void)enumerateTagsInRange:(NSRange)range scheme:(NSLinguisticTagScheme)tagScheme options:(NSLinguisticTaggerOptions)opts usingBlock:(void (NS_NOESCAPE ^)(NSLinguisticTag _Nullable tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop))block;

/*
指定处理单元的方式 根据指定的单元进行内容文本的处理
参数1 range:指定处理传入的内容文本在字符串中的范围
参数2 unit:指定处理的单元
参数3 scheme:指定处理的分类方案
参数4 options:指定筛选条件
参数5 block:处理后的结果返回的block
*/
- (void)enumerateTagsInRange:(NSRange)range unit:(NSLinguisticTaggerUnit)unit scheme:(NSLinguisticTagScheme)scheme options:(NSLinguisticTaggerOptions)options usingBlock:(void (NS_NOESCAPE ^)(NSLinguisticTag _Nullable tag, NSRange tokenRange, BOOL *stop))block;

/*
 类方法,通过类方法直接处理想要的结果而不通过对象获取
参数1 string:需要处理的内容文本
参数2 range:指定处理传入的内容文本在字符串中的范围
参数3 unit:指定处理的单元
参数4 scheme:指定处理的分类方案
参数4 options:指定筛选条件
参数5 block:处理后的结果返回的block
*/
+ (void)enumerateTagsForString:(NSString *)string range:(NSRange)range unit:(NSLinguisticTaggerUnit)unit scheme:(NSLinguisticTagScheme)scheme options:(NSLinguisticTaggerOptions)options orthography:(nullable NSOrthography *)orthography usingBlock:(void (NS_NOESCAPE ^)(NSLinguisticTag _Nullable tag, NSRange tokenRange, BOOL *stop))block;

/*
方法中block回调的参数说明:
NSLinguisticTag _Nullable tag:
 NSRange tokenRange:token处理的单元 所在的范围
NSRange sentenceRange:句子处理的所在范围
 BOOL *stop:是否停止遍历
*/

NSLinguisticTagSchemeTokenType , /*此标记方案根据 token 的广泛通用类型对其进行分类:单词、标点符号、空格等。*/
NSLinguisticTagSchemeLexicalClass,/*此标记方案根据类对token进行分类:单词的话语部分、标点类型或空格等。*/
NSLinguisticTagSchemeNameType, /*此标记方案对token进行分类,以确定它们是否是各种类型的命名实体的一部分。*/
NSLinguisticTagSchemeNameTypeOrLexicalClass, /*此标记方案遵循NSLinguisticTagSchemeNameType和NSLinguisticTagSchemeLexicalClass所表示的token。*/
NSLinguisticTagSchemeLemma,/*此标记方案为每个单词标记(如果已知)提供一个词组形式。*/
 /*NSLinguisticTagSchemeLanguage此标记方案根据最可能的语言(如果已知)标记token。
标记出的值会以标准语言所写形式给出,
例如"en"、"fr"、"de"等,和用 NSOrthography 类的效果相同。
注意此类分词根据的是词语在整个句子或段落中的表意,
而不是只根据该词本身来判断*/
NSLinguisticTagSchemeLanguage,
/*NSLinguisticTagSchemeScript此标记方案根据其Script脚本标记token。
标记不同语言,但会以如下的缩略形式给出:"Latn"、"Cyrl"、"Jpan"、"Hans"、"Hant"等*/
NSLinguisticTagSchemeScript ,

typedef NSString *NS_EXTENSIBLE_STRING_ENUM;

/* NSLinguisticTagSchemeTokenType的类型 */
 NSLinguisticTagWord ,/* Tokens 按照单词或类似单词的语言为标准处理 */
 NSLinguisticTagPunctuation, /* Tokens 按照符号为处理. */
 NSLinguisticTagWhitespace , /* Tokens 按照空白处理. */
 NSLinguisticTagOther, /* token按照非选择的语言或特殊字符处理. */

/* Tags for NSLinguisticTagSchemeLexicalClass */
 NSLinguisticTagNoun,
 NSLinguisticTagVerb,
 NSLinguisticTagAdjective,
 NSLinguisticTagAdverb,
 NSLinguisticTagPronoun,
 NSLinguisticTagDeterminer,
 NSLinguisticTagParticle,
 NSLinguisticTagPreposition,
 NSLinguisticTagNumber,
 NSLinguisticTagConjunction,
 NSLinguisticTagInterjection,
 NSLinguisticTagClassifier,
 NSLinguisticTagIdiom,
 NSLinguisticTagOtherWord,
 NSLinguisticTagSentenceTerminator,
 NSLinguisticTagOpenQuote,
 NSLinguisticTagCloseQuote,
 NSLinguisticTagOpenParenthesis,
 NSLinguisticTagCloseParenthesis,
 NSLinguisticTagWordJoiner,
 NSLinguisticTagDash,
 NSLinguisticTagOtherPunctuation,
 NSLinguisticTagParagraphBreak,
 NSLinguisticTagOtherWhitespace,

/* Tags for NSLinguisticTagSchemeNameType */
 NSLinguisticTagPersonalName,
 NSLinguisticTagPlaceName,
 NSLinguisticTagOrganizationName,
上一篇下一篇

猜你喜欢

热点阅读