我们在做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]]
参考文档:LiveToolkit