文本分類模型處理流程
1.樣本整理
2.資料預處理
-
直接按照字元處理可以使用keras的api
Tokenizer(char_level=True) 建立字元數字索引
text_to_sequences() 将句子轉成數字
pad_sequences() 将句子填充到相同長度
- 分詞 jieba hanlp等(對于項目裡特殊的詞彙,可以手動加到分詞詞庫裡)
- 用其他公司訓練的詞向量
- 自定義詞向量(使用gensim word2vec訓練)
- 直接使用keras Embedding訓練,指定輸出次元,随機初始化後訓練
- word2vec
- skipgram 用中心詞訓練背景詞,實際使用的時中心詞向量,分母是softmax
- cbow 用背景詞訓練中心詞,實際使用的是背景詞
- 這兩種方法每一步梯度計算都包含全部詞典大小數目,為了降低複雜度:
- 負采樣 中心詞在視窗大小裡的背景詞為正樣本,再采樣未出現視窗裡的是噪聲詞,最大化這個機率
- 層序softmax 建立詞頻樹,損失函數通過根節點到葉節點路徑構造
- Glove全局詞嵌入 用條件機率比值表達詞與詞之間的關系。
- fasttext 子詞嵌入 例如3元文法處理love 字詞 lov ove ,從構詞角度分析詞語特點,也就是有些詞是由詞衍生的
3.構模組化型 (文本模型很多,此處舉一個例子)
- Embedding->Conv1D->Max1D->Lstm->Dropout->Dense
4.predict要使用訓練前詞和數字映射關鍵進行處理
5.模型部署可以見https://blog.csdn.net/persistinlife/article/details/103810750
同時可以使用deeplearning4j進行Java工程部署。
6.執行個體 此處是對英文分類就沒有使用中文分詞器處理。
如果使用預訓練處理的詞向量注意此處:
model.add(Embedding(len(embeddings_matrix),
EMBEDDING_DIM,
weights = [embeddings_matrix], #預訓練詞向量 數字和向量映射 例如 2:[0.23,0.34,0.3,....]
trainable = False))#因為已經是訓練後的詞向量 不參與訓練
import sys
import os
import optparse
os.environ['KERAS_BACKEND'] = 'tensorflow'
import keras
from keras.callbacks import TensorBoard
from keras.models import Sequential
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
from keras.preprocessing.text import Tokenizer
from keras.layers import Dense, Flatten, LSTM, Conv1D, MaxPooling1D, Dropout, Activation
tokenizer = Tokenizer(filters='\t\n', char_level=True)
tokenizer.fit_on_texts(x_data)
word_dict_file = 'build/dictionary.json'
if not os.path.exists(os.path.dirname(word_dict_file)):
os.makedirs(os.path.dirname(word_dict_file))
with open(word_dict_file, 'w') as outfile:
json.dump(tokenizer.word_index, outfile, ensure_ascii=False)
num_words = len(tokenizer.word_index)+1
x_token = tokenizer.texts_to_sequences(x_data)
train_size = int(size * .75)
max_log_length = 512
x_processed = sequence.pad_sequences(x_token, maxlen=max_log_length, value=0)
x_train, x_test = x_processed[0:train_size], x_processed[train_size:size]
y_train, y_test = y_data[0:train_size], y_data[train_size:size]
tb_callback = TensorBoard(log_dir='./logs', embeddings_freq=1)
model = Sequential()
model.add(Embedding(num_words, 32, input_length=max_log_length))
model.add(Conv1D(64, 5, activation='relu'))
model.add(MaxPooling1D(pool_size=4))
model.add(LSTM(64, recurrent_dropout=0.5))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(x_train, y_train, validation_split=0.25, epochs=7, batch_size=1024, callbacks=[tb_callback])