数据预处理
枯燥而必须做的三部曲:检查缺失值,文本去重,去噪。
其中文本的噪声一般有:
- 如“\xa0”、“\t”、“\n”等特殊字符。
- 网址。如“https://baidu.com/”等。
- 日期。如“XXXX 年 X 月 X 日”等。
- 地名。如带有“A 市”、“A8 县”,“B4 区”等英文单词为开头的地名。
- 首尾冗余。如“您好!”、“谢谢!”等这些没有价值的字样。
在分词后利用正则表达式选择保留数据集中的文字、标点、数字符号。
分词技术
首先,需要考虑将要用词向量还是字向量喂给模型。
- 词向量。先去找一份适合你的文本的预训练词向量,然后用分词器分词并去除停用词。
中文词向量语料库,该语料库是基于HanLP分词器的。(注意:一定要选择的预训练词向量基于的分词器,并看看分词器在你的文本对命名实体的分词粒度如何) - 字向量。直接选择强大的预训练的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