- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
环境
安装gensim和jieba库
pip install gensim jieba
步骤
分词
使用jieba进行分词,通过调整一些人名的词频,防止人名被分词。
names = ['沙瑞金', '田国富', '高育良', '候亮平', '钟小艾', '陈岩石', '欧阳菁', '易学习', '王大路', '蔡成功', '陈连城', '季昌明', '丁义珍', '郑西坡', '赵东来', '高小琴', '赵瑞龙', '林华华', '陆亦可', '刘新建', '刘庆祝', '赵德汉']
for name in names:
jieba.suggest_freq(name, True)
然后读取文本,进行分词
with open('in_the_name_of_peoples.txt', encoding='utf-8') as f:
result_cut = []
lines = f.readlines()
for line in lines:
result_cut.append(jieba.lcut(line))
f.close()
添加自定义停用词,把一些标点,空格,符号等去除
stopwords_list = [',', '。', '\n', '\u3000', ' ', ':', '!', '?', "…"]
# 删除停用词
def remove_stopwords(ls):
return [word for word in ls if word not in stopwords_list]
result_stop = [remove_stopwords(x) for x in result_cut if remove_stopwords(x)]
随机打印几行文字,看下效果
print(result_stop[100:103])
训练word2vec模型
直接调用gensim提供的工具函数来进行模型训练
from gensim.models import Word2Vec
# vector_size 代表了特征向量的维度
# window=5 意思是一个句子中当前单词和被预测单词的最大距离
# min_count=1 可以对字典做截断,词频少于min_count次数的单词会被丢弃,不能在一起特征向量计算
model = Word2Vec(result_stop, vector_size=100, window=5, min_count=1)
模型应用
计算词汇间的相似度
可以使用similarity()
方法计算两个词汇间的余弦相似度
print(model.wv.similarity('沙瑞金', '季昌明'))
print(model.wv.similarity('沙瑞金', '田国富'))
还可以在模型中选择出与给定的词汇最相似的n个词汇
for word, similarity in model.wv.most_similar(positive=['沙瑞金'], topn=5):
print(word, similarity)
找出不匹配的词汇
odd_word = model.wv.doesnt_match(['苹果', '香蕉', '橙子', '书'])
print(f"在这组词汇中不匹配的词汇是: {odd_word}")
计算词汇的词频
word_frequency = model.wv.get_vecattr('沙瑞金', 'count')
print(f"沙瑞金:{word_frequency}")
说明沙瑞金这个词汇在所有的句子中一共出现了353次。
总结与心得体会
通过本次实验,我发现传统的机器学习与深度学习任务比起来,节约的计算机性能不是一点半点。因此在一个任务使用传统的机器学习方法就可以取得不错的效果时,其实根本就没有必要使用深度学习模型。
通过word2vec模型的部分应用效果,感觉效果比深度学习模型差别很大,有可能是因为停用词只去除了标点符号,但是中文有很多常见的停用词,如“的”,“了”这种词汇,但是有些动词在句子中是有意义的,在相似问题中却是没什么意义,就像上面搜索与沙瑞金相似度较高的词汇,竟然出现了“做”, “像”这种动词,显然是不太合理的。这可能就是Word2Vec模型的弊端,它并不能从句子角度来分析,只能在词汇的角度进行一些统计意义上的分析与建模。