在NLP的任务中,你可能要找一种词嵌入方法,不如谷歌的word2vector,斯坦福的GloVe或facebook的fasttext,使用的过程中,你会发现有些单词找不到。下面是我总结的解决方法。
1. 对每个英语单词做预处理。
- 原始词有没有
- 全小写有没有
- 全大写有没有
- 首字母大写有没有
- 词拆分(比如it's -> it 's, I've -> I 've。。 可以参考最下面的代码)
- 三种次干化有没有 (nltk.stem)
- 长得最像的几种编辑方法有没有
2. 如果还是没有在相应的word2vector里找到。
- 添加未知单词标记(unknown),大多数人解决此问题的方法。
- (删除未知词)是最不好的。
- 最近开发的另一种选择是使用卷积神经网络或单独的 LSTM 为每个词创建动态词嵌入,一次处理每个词的字符。 使用这种技术,您的模型将永远不会遇到无法为其创建嵌入的单词
- 用随机数代替,通过下游的任务来训练未知的词向量。
其它
import re
# remove html tag like '<br /><br />'
def rm_tags(text):
re_tag = re.compile(r'<[^>]+>')
return re_tag.sub(' ', text)
def clean_str(string):
string = re.sub(r"[^A-Za-z0-9(),!?\'\`]", " ", string)
string = re.sub(r"\'s", " \'s", string) # it's -> it 's
string = re.sub(r"\'ve", " \'ve", string) # I've -> I 've
string = re.sub(r"n\'t", " n\'t", string) # doesn't -> does n't
string = re.sub(r"\'re", " \'re", string) # you're -> you are
string = re.sub(r"\'d", " \'d", string) # you'd -> you 'd
string = re.sub(r"\'ll", " \'ll", string) # you'll -> you 'll
string = re.sub(r"\'m", " \'m", string) # I'm -> I 'm
string = re.sub(r",", " , ", string)
string = re.sub(r"!", " ! ", string)
string = re.sub(r"\(", " \( ", string)
string = re.sub(r"\)", " \) ", string)
string = re.sub(r"\?", " \? ", string)
string = re.sub(r"\s{2,}", " ", string)
return string.strip().lower()
def process(text):
text = clean_str(text)
text = rm_tags(text)
return text