写在前面
随着bert等技术的兴起,在做文本方面比赛时,对于预处理这一块像中文分词,停用词过滤,词形还原,词干化,标点符号处理等变的不再这么重要。当然也可以从另一个角度来看,这些对于文本的预处理方法相当于减少输入的噪声,是可以让神经网络更具有鲁棒性的。所以以下内容可以作为一个知识储备在这里,在工作中是否需要用到它们全凭自己判断。
预处理方法
- 停用词过滤:比如去除文本中含有的the、also、at等
- 词形还原(Lemmatization):比如将ate变成eat,做法参考NLP入门(三)词形还原(Lemmatization),如果在使用上面链接时存在无法分词的情况可以参考安装和使用NLTK分词和去停词,下面也贴上一段从该文章中拷贝的代码
### 用于词形还原
from nltk import word_tokenize, pos_tag
from nltk.corpus import wordnet
from nltk.stem import WordNetLemmatizer
# 获取单词的词性
def get_wordnet_pos(tag):
if tag.startswith('J'):
return wordnet.ADJ
elif tag.startswith('V'):
return wordnet.VERB
elif tag.startswith('N'):
return wordnet.NOUN
elif tag.startswith('R'):
return wordnet.ADV
else:
return None
sentence = 'football is a family of team sports that involve, to varying degrees, kicking a ball to score a goal.'
tokens = word_tokenize(sentence) # 分词
tagged_sent = pos_tag(tokens) # 获取单词词性
wnl = WordNetLemmatizer()
lemmas_sent = []
for tag in tagged_sent:
wordnet_pos = get_wordnet_pos(tag[1]) or wordnet.NOUN
lemmas_sent.append(wnl.lemmatize(tag[0], pos=wordnet_pos)) # 词形还原
print(lemmas_sent)
输出结果为[‘football’, ‘be’, ‘a’, ‘family’, ‘of’, ‘team’, ‘sport’, ‘that’, ‘involve’, ‘,’, ‘to’, ‘vary’, ‘degree’, ‘,’, ‘kick’, ‘a’, ‘ball’, ‘to’, ‘score’, ‘a’, ‘goal’, ‘.’]
- 词干化(stemming):很多情况下词干化后的形式和词形还原一样,但是无法保证词干化后的单词是一个正确的单词,比如将’cats’–>‘cat’, ‘leaves’–>‘leaf’
- 同义词替换:比如将good,well,excellent等全部替换成good
- 分词:比如将"hello world"变成“hello”,“world”,将"你好世界"变成"你好",“世界”
- 标点过滤:比如网页上的文本,标点符号使用不规范,同时拥有多个都哈或句号,这种形式可以将多余的替换成一个,处理的主要应用方法为正则表达式
- emoji表情处理:emoji表情对于做情感分析是很重要的,最好不要将其归咎为词向量中的unknown一类,如果知道文本中的emoji表情的出处,可以在这个emoji表情的出处找到对应的中文文本将其替换,比如大家常用的笑哭emoji直接替换成笑哭,或者英文形式;如果你有一套emoji预训练词向量,则将词向量中该emoji对应的词进行替换,如果没有,可以将该emoji加入到分词工具的词典中,保证分词时可以将emoji独立出来,如果在之后的任务中使用神经网络建模,可以保证emoji能够随机初始化成词向量,如果用主题模型的方式,也能够保证emoji成为词袋中词的一部分