以下对于直接写和使用keras内置进行处理进行了对比总结。
(一)清理文本并分词
1.直接写
#1 清理文本
import re
token=re.compile('[A-Za-z]+|[!?,.]')
#2 分词
def reg_text(text):
new_text=token.findall(text) #把想要的都找出来
new_text=[word.lower() for word in new_text] #进行小写处理(也算是清理)并写回列表
return new_text
data['text']=data['text'].apply(reg_text) #调用
2.(准备)使用keras
def preprocess_sentence(w):
w=w.lower().strip() #lower是大写变小写,strip是去掉两边的空格
w=re.sub(r"([?,!.])", r" \1 ", w) #把标点符号与单词分离开来,使它像个单词一样单独被提取
w=re.sub(r'[" "]+', " ", w) # 把一个或多个空格都替换成一个空格
w=re.sub(r"[^a-zA-Z?,!.]+", " ", w) #去掉除了正常字母和正常标点以外的东西
w.strip() #去掉前后的空格
return w.split() #把处理好的文本词语装进列表
text=[preprocess_sentence(w) for w in data.review] #一边调用一边写入列表
(二)文本编码(顺序编码)
1.直接写
#1 单词计数
word_set=set()
for text in data.text:
for word in text:
word_set.add(word)
length=len(word_set)
#2 构建起对应字典
word_list=list(word_set)
word_index=dict((word,word_list.index(word)+1) for word in word_list)
#这个+1很重要,因为我们后来要做一个填充,让每个句子的单词数目相同,要把空白位置用0填充,所以不能有序号为0的单词,即序号从1开始
#3 文本编码
data_final=data.text.apply(lambda x: [word_index.get(word) for word in x])
2.使用keras内置方法
max_words=20000
#初始化一个tokenizer
tokenizer=keras.preprocessing.text.Tokenizer(num_words=max_words,filters='')
#将其在text上fit一下
tokenizer.fit_on_texts(text)
#文本编码
tensor=tokenizer.texts_to_sequences(text)
(三)进行等长处理
maxlen=max(len(x) for x in tensor) #也可以先print出来,然后自主折中选择一个合适的
tensor=keras.preprocessing.sequence.pad_sequences(tensor,maxlen=max_len,padding='post')
(四)embedding
model=keras.Senquential()
model.add(layers.Embedding(input_dim=max_word,
output_dim=100,
input_length=max_len))
#embedding把文本映射成一个密集向量(与one-hot编码相对应的)