Word Embedding 如何处理未登录词?

在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

猜你喜欢

转载自blog.csdn.net/keeppractice/article/details/130540945