摘要:本文旨在对情感分类任务的工作流程做一个简单的梳理,总结了大体框架,及一些需要注意的细节问题,作为总结。
目录
标题1.文本预处理
标题2.词带模型做文本表征
标题3.word2vec做词表征
标题4.用处理好的表征训练模型进行分类
无论用哪种模型进行文本表征或分类,第一步肯定是对数据进行预处理,做特征工程。
对影评数据做预处理,大概有以下环节:
1.用pandas读入数据,理解数据(可视化分析/统计信息)
对数据的理解是任何AI工作的第一步,需要充分对手上的数据有个更直观的理解。
统计一下在qlist 总共出现了多少个单词? 总共出现了多少个不同的单词?
统计一下qlist中每个单词出现的频率,并把这些频率排一下序,然后画成plot.
2.去掉html标签
from bs4 import BeautifulSoup
# BeautifulSoup是一个专门处理网页爬下来的文本的库,可将里边的各种字符去掉。
example = BeautifulSoup(raw_example, 'html.parser').get_text()
3.移除标点
# 一般需要正则
example_letters = re.sub(r'[^a-zA-Z]', ' ', example)
4. 切分成词/token
words = example_letters.lower().split()
5. 去掉停用词
# 停用词可以用本地的也可用nltk等库里的,根据情况自己定
#words_nostop = [w for w in words if w not in stopwords.words('english')]
stopwords = {}.fromkeys([ line.rstrip() for line in open('../stopwords.txt')])
words_nostop = [w for w in words if w not in stopwords]
6. 重组为新的句子
#eng_stopwords = set(stopwords.words('english'))
eng_stopwords = set(stopwords)
def clean_text(text):
text = BeautifulSoup(text, 'html.parser').get_text()
text = re.sub(r'[^a-zA-Z]', ' ', text)
words = text.lower().split()
words = [w for w in words if w not in eng_stopwords]
return ' '.join(words)
7. 另外还可以做stemming,lemenazitong(英文),去掉低频词,正则处理一些表情符号,邮箱等。这里需注意:Word2vec是需要上下文关系的,这里的停用词有时候不去掉效果可能会更好。
word2vec出现之前通常用词带模型进行表征,即每个词作为一个特征(通常取整个语料的前5000个词),词频作为特征值,进行文本表示。需用到sklearn中的countevectorizer方法。
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(max_features = 5000)
train_data_features = vectorizer.fit_transform(df.clean_review).toarray()
1.首先,第一步也是做预处理(如标题1)
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
raw_sentences = tokenizer.tokenize(review.strip())
sentences = [clean_text(s) for s in raw_sentences if s]
# nltk.data.load('tokenizers/punkt/english.pickle')加载英文的划分句子的模型
#tokenizers/punkt/ 这里面有好多训练好的模型,只能划分成句子,不能划分成单词
2.用gensim训练处理好的文本
model = Word2Vec(sentences, workers=num_workers, \
size=num_features, min_count = min_word_count, \
window = context, sample = downsampling)
# If you don't plan to train the model any further, calling
# init_sims will make the model much more memory-efficient.
model.init_sims(replace=True)
# It can be helpful to create a meaningful model name and
# save the model for later use. You can load it later using Word2Vec.load()
model.save(os.path.join('..', 'models', model_name))
3.保存加载模型方法:
# 保存模型
# 第一种方法保存的文件不能利用文本编辑器查看,但是保存了训练的全部信息,可以在读取后追加训练
# 后一种方法保存为word2vec文本格式,但是保存时丢失了词汇树等部分信息,不能追加训练
model.save(os.path.join('..', 'models', model_name))
model.wv.save_word2vec_format(os.path.join('..','models','word2vec_txt.txt'),binary = False)
# 加载模型,根据保存时的格式不同,有两种加载方式
model = models.Word2Vec.load(os.path.join('..', 'models', model_name))
model_txt = models.KeyedVectors.load_word2vec_format(os.path.join('..','models','word2vec_txt.txt'),binary = False)
# 可以同时取出一个句子中单词的词向量
model.wv[['man','woman','guy']]
1.根据word2vec的结果去对影评文本进行编码,编码方式有一点粗暴,简单说来就是把这句话中的词的词向量做平均
def to_review_vector(review):
words = clean_text(review, remove_stopwords=True)
array = np.array([model[w] for w in words if w in model])
return pd.Series(array.mean(axis=0))
2. 用随机森林分类器进行训练:
forest = RandomForestClassifier(n_estimators = 100, random_state=42)
forest = forest.fit(train_data_features, df.sentiment)
参考:
https://www.cnblogs.com/Luv-GEM/p/10890010.html
https://blog.csdn.net/YoungshellZzz/article/details/88385801
https://blog.csdn.net/pit3369/article/details/95594728讲解了word2vec结合k-means聚类进行关键词提取的方法