iOS - 机器学习《二》

时间:2022-11-03 18:31:28

一、前言

  前面一篇博文简单的通过官方文档来了解了下机器学习是什么,以及简单的文字筛选Demo,但是我在实际执行过程中遇到的些问题,在这里抛出来。

二、训练源

  我准备做出一个可以识别影评是好评、差评还是中评的机器学习模型。

  这是我准备的数据:

[
    {
        "text":"这部电影真好看",
        "label":"好评"
    },
    {
        "text":"太烂了",
        "label":"差评"
    },
    {
        "text":"一般般,不算差也不算好",
        "label":"中评"
    },

  然后当我在playground里面执行这句代码的时候:

//训练源地址
let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/Users/sunjiaqi/Desktop/data.json"))

//导入训练源数据
let sentimentClassifier = try MLTextClassifier(trainingData: data, textColumn:"text",
labelColumn: "label")

  报错了,

 

iOS - 机器学习《二》

 

  经过一番查找资料后得知,Creater ML 是不支持中文输入的,这就很坑。

  那怎么办呢,有办法,将中文转成UTF-16编码,这个编码后的汉字就变成一个又一个数字了,也就可以进行训练了

  文字转UTF16编码和导出JSON文件的代码奉上

NSMutableArray *textList = [[NSMutableArray alloc] init];
    // 获取文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
    // 将文件数据化
    NSData *data = [[NSData alloc] initWithContentsOfFile:path];
    NSArray *dataPathList = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    [dataPathList enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSString *moviceContent = obj[@"text"];//影评内容
        NSString *moviceType = obj[@"label"];//影评类型
        moviceContent = [moviceContent stringByReplacingPercentEscapesUsingEncoding:NSUTF16StringEncoding];
        NSDictionary *dict = @{@"text":moviceContent,@"label":moviceType};
        [textList addObject:dict];
    }];
    
    //将数组转成JSON写入文件
    NSData *whirtData =[NSJSONSerialization dataWithJSONObject:textList options:NSJSONWritingPrettyPrinted error:0];
    [whirtData writeToFile:@"/Users/zhaowenjuan/Desktop/apps2.json" atomically:YES];

  注:很多人会问,为啥这里的代码又用OC来写了,我只想说我用OC习惯点,这段代码很简单,会swift的也可以轻易的转出来。

  数据终于准备好了,开始训练吧。

三、使用

  模型的训练与导出没有什么可说的了,就那固定的几行代码

  关键是该怎么使用。

  1、将模型直接拖入项目中,打开模型的话会看见一个文件的快捷入口,这个头文件就是自动生成的,里面有调用模型的方法。

  2、构建一个模型的方法

- (nullable MCContentFilter *)model {
    auto bundle = [NSBundle bundleForClass:MCContentFilter.class];
    auto mlmodelcURL = [bundle URLForResource:@"MCContentFilter" withExtension:@"mlmodelc"];
    if (mlmodelcURL) {
        return [MCContentFilter new];
    }

    auto modelPath = [bundle pathForResource:@"MCContentFilter" ofType:@"mlmodel"];
    if (!modelPath) return nil;

    auto modelURL = [NSURL fileURLWithPath:modelPath];
    mlmodelcURL = [MLModel compileModelAtURL:modelURL error:nil];
    if (!mlmodelcURL) return nil;

    auto model = [[MCContentFilter alloc] initWithContentsOfURL:mlmodelcURL error:nil];
    return model;
}

  用法

auto model = [self model];

  注:auto 自动类型推导

  3、调用模型方法

model predictionFrom

  类似于这样的方法。

  模型的作用只是做出判断,它不关心你是中文还是英文,它都看不懂,它只能根据你给的数据规则来判断和匹配,随意生成训练源数据这步非常重要!

  demo过段时间再整理吧,今天太晚了,晚安。