分享中文NLP比赛的经验

数据预处理

枯燥而必须做的三部曲:检查缺失值,文本去重,去噪。
其中文本的噪声一般有:

  1. 如“\xa0”、“\t”、“\n”等特殊字符。
  2. 网址。如“https://baidu.com/”等。
  3. 日期。如“XXXX 年 X 月 X 日”等。
  4. 地名。如带有“A 市”、“A8 县”,“B4 区”等英文单词为开头的地名。
  5. 首尾冗余。如“您好!”、“谢谢!”等这些没有价值的字样。

在分词后利用正则表达式选择保留数据集中的文字、标点、数字符号。

分词技术

首先,需要考虑将要用词向量还是字向量喂给模型。

  1. 词向量。先去找一份适合你的文本的预训练词向量,然后用分词器分词并去除停用词。
    中文词向量语料库,该语料库是基于HanLP分词器的。(注意:一定要选择的预训练词向量基于的分词器,并看看分词器在你的文本对命名实体的分词粒度如何)
  2. 字向量。直接选择强大的预训练的BERT模型,然后提取ENCODER层得到文章的embedding矩阵。
from pytorch_pretrained_bert import BertModel, BertTokenizer

MAX_LEN = 32+2 #序列长度(最多支持512的序列长度)。

# 加载bert的分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese-vocab.txt')
# 加载transformer的 ENCODER Layer
model = BertModel.from_pretrained('bert-base-chinese')
#分字
tokens = np.array([['[CLS]'] + tokenizer.tokenize(sentence)[:MAX_LEN-2] + ['[SEP]'] for sentence in data['留言主题']])
print(tokens[0])
#编码
input_ids = np.array([tokenizer.convert_tokens_to_ids(t + ['[PAD]'] * (MAX_LEN-len(t))) for t in tokens])
print(input_ids[0])
masks=torch.tensor([[1 if i else 0 for i in id] for id in input_ids])
#提取特征
 _,pooled = model(input_ids, attention_mask=masks,output_all_encoded_layers=False)
 print(pooled.size()) # (n*768) n为文章数量

选择模型并训练

1.轻量级网络:TextCNN,LightGBM。用来跑baseline是比较不错的选择。
2.复杂点的网络:BERT,TextRNN。最后我还是选择了bert,实在太香了。
3.用5折交叉验证提高模型的泛化能力。

最后,用F1-score来评价模型。

小tips

  • 解决样本不平衡问题的方法:重采样,重加权。
  • 提升模型精度的技巧:文本增强策略(如EDA),在特征工程上搞点东西(如关键词拼接到文本中[CLS][原始文本][SEP][关键词1][SEP]…; 标签特征与文本拼接,然后进行2分类)

好文章分享:
https://blog.csdn.net/weixin_47922824/article/details/111154224

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值