文本相似度比赛baseline

比赛地址:https://tianchi.aliyun.com/competition/entrance/231776/information

训练集共包括8753对数据,共八种类别:'哮喘', '咳血', '支原体肺炎', '肺气肿', '肺炎', '上呼吸道感染', '胸膜炎', '感冒'。比赛任务是进行细粒度的文本匹配(具体见官网),数据大致如下:

文本相似度比赛baseline_第1张图片

首先简单观察一下数据,检查NAN值:

文本相似度比赛baseline_第2张图片

label一列有6个NAN值,整行删除:

文本相似度比赛baseline_第3张图片

每一种类别的正例负例的数量大致平衡:

文本相似度比赛baseline_第4张图片

经过观察可以发现每一种类的问句1(query1),是比较官方的提问方法且每个问句1对应多个问句2:

文本相似度比赛baseline_第5张图片

文本相似度比赛baseline_第6张图片

根据上述观察以及bert的相似度问题的处理方法,将category与query1合并与query计算相似度,输入类型:

【CLS】【category+query1】【SEP】【query2】

接下来就是fine-tuning的代码,bert model采用google官方的tensorflow版本,预训练模型为官方的chinese_L-12_H-768_A-12版本,具体可见官网的github。fine-tuning过程主要是改写run_classifier.py中的类DataProcessor,放一下代码:

class SimProcessor(DataProcessor):
    def get_train_examples(self, data_dir):
        """See base class."""
        examples = []
        file_path = os.path.join(data_dir, 'train.csv')
        train_data = pd.read_csv(file_path)
        for i in range(len(train_data)):
            guid = "train_id-%d" % (i)
            text_a = tokenization.convert_to_unicode(train_data.loc[i]["category"] + train_data.loc[i]["query1"])
            text_b = tokenization.convert_to_unicode(train_data.loc[i]["query2"])
            label = str(train_data.loc[i]["label"])
            examples.append(
                     InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label))
        return examples

    def get_dev_examples(self, data_dir):
        """See base class."""
        examples = []
        file_path = os.path.join(data_dir, 'dev.csv')
        train_data = pd.read_csv(file_path)
        for i in range(len(train_data)):
            guid = "dev_id-%d" % (i)
            text_a = tokenization.convert_to_unicode(train_data.loc[i]["category"] + train_data.loc[i]["query1"])
            text_b = tokenization.convert_to_unicode(train_data.loc[i]["query2"])
            label = str(train_data.loc[i]["label"])
            examples.append(
                InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label))
        return examples

    def get_test_examples(self, data_dir):
        """See base class."""
        examples = []
        file_path = os.path.join(data_dir, 'dev.csv')
        train_data = pd.read_csv(file_path)
        for i in range(len(train_data)):
            guid = "test_id-%d" % (i)
            text_a = tokenization.convert_to_unicode(train_data.loc[i]["category"] + train_data.loc[i]["query1"])
            text_b = tokenization.convert_to_unicode(train_data.loc[i]["query2"])
            label = str(train_data.loc[i]["label"])
            examples.append(
                InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label))
        return examples

    def get_labels(self):
        """See base class."""
        return ["0.0", "1.0"]

再在main()函数的processors中加入我们自己定义的相似度匹配任务即可:

文本相似度比赛baseline_第7张图片

最后改一下flags参数就可以运行,白嫖深脑链服务器半个小时试了一下:

文本相似度比赛baseline_第8张图片

疫情这么久,也好久没写代码了,主要是练练手,等27号A榜开了之后,再好好研究一下。

 

你可能感兴趣的:(NLP)