tokenizer的生成及padding

我们在做embedding的时候,通常会先做下tokenizer,然后再做word embedding,我们下面看看怎么来生成tokenizer。

1. 可以先搞一批raw data,可以从网上爬下来,也可以从已有的collection下载。

2. 做下分词,中文可以用结巴,英文用空格和特殊符号

3. 分词生成的terms,我们保存下来,每句话可以保存一行,每行多个terms,用空格分隔

4. 用分词的term生成tokenizer,并做下padding。我们这里只关注这个部分,其他部分可以参考其他的。

5. 生成word embedding

下面我们看下tokenizer怎么来做:

keras提供了tokenizer包可以直接用来生产tokenizer,我们下面来看下怎么用,直接上代码。

#!/usr/bin/python
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from sklearn.externals import joblib

def tryTokenizer():
    # read data
    #sentence=[]
    #with open('term_raw.txt',encoding = "utf-8",errors="ignore") as f:
    #    for line in f:
    #            sentence.append(str(line).replace('\n',''))
    sentences = ['今天 天气 不错', '明天 天气 还行', '这是 什么 天气 啊'] # hard code here

    # Tokenizer
    num_words = 3 # 设置的最大词数
    tk = Tokenizer(num_words=num_words + 1, oov_token='UNK') # 因为需要增加未登录的词,所有+1
    tk.fit_on_texts(sentences)
    tk.word_index = {e:i for e, i in tk.word_index.items() if i <= num_words}
    tk.word_index[tk.oov_token] = num_words + 1
    print(tk.word_index)
    sequences = tk.texts_to_sequences(["这是 什么 天气 呀", '我的 天 呐'])
    print(sequences)

    # Padding
    data = pad_sequences(sequences, maxlen=5, padding='post') # 对齐
    print(data)

    # Save tonkenizer result
    joblib.dump(tk, 'data_tk_joblib_result.pkl') # 模型保存
    tokenizer = joblib.load('data_tk_joblib_result.pkl') # 模型加载
    sequences = tokenizer.texts_to_sequences(["这是 什么 天气 呀", '我的 天 呐'])
    print(sequences)

if __name__ == "__main__":
    tryTokenizer()

输出结果如下:

{'UNK': 4, '天气': 2, '今天': 3}
[[4, 4, 2, 4], [4, 4, 4]]
[[4 4 2 4 0]
 [4 4 4 0 0]]
[[4, 4, 2, 4], [4, 4, 4]]

你可能感兴趣的:(keras,tokenizer,padding,word2vec)