数据准备

由于模型需要通过标注数据来从中学习规律,我们首先要准备好一个标注数据集。以情感分析任务为例,我们的每一条数据为一个(文本,情感)对。例如:(“这个牌子的红枣很不错”,“正”)。情感一共有三种不同的类别:“正”,“中”,“负”。对于每一个不同的类别,我们建议至少准备500条训练数据再进行测试。训练数据需要按照NLP自学习平台定义好的格式进行处理,以JSON为例,您需要将每一条数据处理成如下格式:

{
    "1": {
        "content": "这个牌子的红枣很不错",
        "records": {
            "情感": "正"
        }
    }
}

文本的内容放在“content”中,而标签的内容放在“records”中,其中content只支持string类型,records字段是一个对象类型。records字段的key代表了题目名称,只支持string类型;value代表具体的标签,可以支持整数类型(如0,1)、string类型(如“正”、“中”、“负”)以及更复杂的数组\对象类型。NLP 自学习平台支持多种文本分类的场景,包括“多题目”,“多标签”,“多层级”以及以上三种场景的组合

多题目

多题目是指对于一段文本,可以进行不同种类的分类,比如对于商品评论文本,您可能不仅想知道评论里的情感,还想知道评论是针对什么类型的商品。所以就有了两个题目,这时数据格式可以如下设计,即在records字段的最外层添加一个“商品类别”的key,以及设置对应的value为“食品”

{
    "1": {
        "content": "这个牌子的红枣很不错",
        "records": {
            "情感": "正",
            "商品类别": "食品"
        }
    }
}

当数据存在多题目时,NLP自学习平台支持包含缺失值的情况,即部分数据的部分题目没有标注。如数据集包含两条数据,第一条对于“情感”和“商品类别”都有标注,而在第二条数据中,只是对于“情感”有标注,“商品类别”无标注。此时的标注格式应当如下所示:

{
    "1": {
        "content": "这个牌子的红枣很不错",
        "records": {
            "情感": "正",
            "商品类别": "食品"
        }
    },
    "2": {
        "content": "非常不错,超级喜欢",
        "records": {
            "情感": "正"
        }
    }
}

多标签

多标签是指,有时对于同一段文本,可能不止有一个标签是对的,而是可以同时属于多种标签。比如我们希望通过文本判断“食品类别”这个题目,而黄瓜既可以是“蔬菜”又可以是“水果”。这时数据的格式可以如下设计:

{
    "1": {
        "content": "黄瓜很好吃,特别的脆,超级喜欢",
        "records": {
            "情感": "正",
            "食品类别": ["水果", "蔬菜"]
        }
    }
}

注意records字段的格式,针对“情感”来说是个多分类问题,即只存在唯一的标签,因此其value为string类型,而“食品类别”为多标签,因此其value为数组类型。如果多标签只存在一个,则与多分类无差异,比如下面的数据格式与上面是等价的

{
    "1": {
        "content": "黄瓜很好吃,特别的脆,超级喜欢",
        "records": {
            "情感":  ["正"],
            "食品类别": ["水果", "蔬菜"]
        }
    }
}

多层级

多层级是指对于我们的标签体系,有时并不是完全平铺的,而是含有层级关系的。比如淘宝的商品的类目体系就是一个层次结构,在第一层我们有“服装”,“电器”,“食品”等分类,而“食品”在第二层还可以细分为“肉类”,“蔬菜”,“水果”等类别。这样就构成了一个层次结构。比如对于商品类别,我们想识别出每一层的标签,则可以构建如下数据格式:

{
    "1": {
        "content": "这个牌子的红枣很不错",
        "records": {
            "情感": "正",
            "商品类别": [["食品", "水果"]]
        }
    }
}

如果数据需要再增加一个层级,比如在“水果”下面再增加“热带水果”一类,数据格式应该如下:

{
    "1": {
        "content": "猫山王榴莲的口感醇厚,味道肥美,绝对是五星级",
        "records": {
            "情感": "正",
            "商品类别": [["食品", "水果", "热带水果"]]
        }
    }
}

注意这边“商品类别”这个题目下的value变成了一个二维嵌套数组,其中”食品”, “水果”, “热带水果”构成了一个层次递进关系。

在数据为多层级的情形下,NLP自学习平台支持路径不完整的情形,即部分数据没有从根节点到叶子节点的完整标签,此时的标注格式应当如下:

{
    "1": {
        "content": "黄瓜很好吃,特别的脆,超级喜欢",
        "records": {
            "情感": "正",
            "商品类别": [["食品", "水果"]]
        }
    },
    "2": {
        "content": "这个东西很好吃,口感简直绝了",
        "records": {
            "情感": "正",
            "商品类别": [["食品"]]
        }
    }
}

在这个例子中,数据集里共包含两条数据,第一条对于“商品类别”标注到了第二层级,而在第二条数据中,对于“商品类别”只标注到了第一层级。同样地,针对只有单层和单标签的例子,可以看做层次分类中的特殊情况,因此上述第二条数据里"商品类别": [["食品"]]"商品类别": "食品"没有任何差异。同样地,对于单层次多标签的例子,以下两种表示方法也是完全一致的:"食品类别": [["蔬菜"], ["水果"]]"食品类别": ["蔬菜", "水果"]

更复杂的示例

当数据本身既包含多题目、多层级,又包含多标签的时候,有时多个标签会分布在不同的层次路径下时,此时可以通过如下的格式来组织数据

{
    "1": {
        "content": "泰国金枕榴莲,令人回味无穷,健脾补气,补肾壮阳",
        "records": {
            "情感": "正",
            "商品类别": [
                ["食品", "药用食品"],
                ["食品", "水果", "热带水果"],
                ["食品", "产地", "东南亚", "泰国"]
            ]
        }
    }
}

注意在“食品”这个一级类目下,该文本存在“药用食品”二级标签;同时在”水果”二级类目下,存在三级标签“热带水果”;另外在“产地”这个二级类目下,存在三级类目“东南亚”,之后存在四级标签“泰国”

阿里云首页 自然语言处理 相关技术圈