- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊 | 接辅导、项目定制
- 🚀 文章来源:K同学的学习圈子
目录
本周任务:
1.阅读NLP基础知识里Word2vec详解一文,了解并学习Word2vec相关知识
2.创建一个 .txt 文件存放自定义词汇,防止其被切分
1.安装Gensim库
2.对原始语料分词
选择《人民的名义》的小说原文作为语料,先采用iieba进行分词。这里是直接添加的自定义词汇没有选择创建自定义词汇文件。(任务2代码处)
import jieba
import jieba.analyse
jieba.suggest_freq('沙瑞金',True)#加入一些词,使得jieba分词准确率更高
jieba.suggest_freq('田国富',True)
jieba.suggest_freq('高育良',True)
jieba.suggest_freq('侯亮平',True)
jieba.suggest_freq('钟小艾',True)
jieba.suggest_freq('陈岩石',True)
jieba.suggest_freq('欧阳菁',True)
jieba.suggest_freq('易学习',True)
jieba.suggest_freq('王大路',True)
jieba.suggest_freq('蔡成功',True)
jieba.suggest_freq('孙连城',True)
jieba.suggest_freq('季昌明',True)
jieba.suggest_freq('丁义珍',True)
jieba.suggest_freq('郑西坡',True)
jieba.suggest_freq('赵东来',True)
jieba.suggest_freq('高小琴',True)
jieba.suggest_freq('赵瑞龙',True)
jieba.suggest_freq('林华华',True)
jieba.suggest_freq('陆亦可',True)
jieba.suggest_freq('刘新建',True)
jieba.suggest_freq('刘庆祝',True)
jieba.suggest_freq('赵德汉',True)
with open('./data/in_the_name_of_people.txt', encoding='utf-8')as f:
result_cut = []
lines = f.readlines()
for line in lines:
result_cut.append(list(jieba.cut(line)))
f.close()
输出结果:
3.停用词
在自然语言处理(NLP)中,停用词(stop words)是指在文本中频繁出现但对于传达实际意义贡献不大的词。这些词通常是冠词、介词、连词等,例如“的”、“和”、“是”、“在”等。停用词在文本中几乎无处不在,但它们并不携带太多实际的语义信息。
拿到了分词后的文件,在一般的NLP处理中,会需要去停用词。由于word2vec的算法依赖于上下文,而上下文有可能就是停词。因此对于word2vec,我们可以不用去停词,仅仅去掉一些标点符号,做一个简单的数据清洗。
现在我们可以直接读分词后的文件到内存。这里使用了word2vec提供的LineSentence类来读文然后套用word2vec的模型。在实际应用中,可以调参提高词的embedding的效果。
#添加自定义停用词
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])
4.训练Woed2Vec模型
from gensim.models import Word2Vec
model =Word2Vec(result_stop,#用于训练的语料数据
vector_size=100,#是指特征向量的维度,默认为100。一个句子中当前单词和被预测单词的最大距离。
window=5,min_count=1)#可以对字典做截断.词频少于min_count次数的单词会被丢弃掉,
5. 模型应用
1.计算词汇相似度
我们可以使用 similarity()方法计算两个词汇之间的余弦相似度。
#计算两个词的相似度
print(model.wv.similarity('沙瑞金','季昌明'))
print(model.wv.similarity('沙瑞金','田国富'))
#选出最相似的5个词
for e in model.wv.most_similar(positive=['沙瑞金'],topn=5):print(e[0],e[1])
2.找出不匹配的词汇
使用 doesnt_match()方法,我们可以找到一组词汇中与其他词汇不匹配的词汇
odd_word =model.wv.doesnt_match(["苹果","香蕉","橙子","书"])
print(f"在这组词汇中不匹配的词汇:{odd_word}")
3.计算词汇的词频
我们可以使用 get_vecattr()方法获取词汇的词频
word_frequency = model.wv.get_vecattr("沙瑞金", "count")
print(f"沙瑞金: {word_frequency}")
6.总结:
jieba分词库的使用
- 分词功能:通过
jieba.cut
方法对文本进行分词。suggest_freq
函数用于添加一些特定的词汇,以提高分词的准确性。 - 自定义停用词:通过
remove_stopwords
函数过滤掉指定的停用词,这些词汇在文本处理中通常不携带有用的信息,如标点符号、换行符等。
2. Word2Vec模型的基本使用
- 模型初始化:
Word2Vec
类的初始化参数:vector_size=100
:设定特征向量的维度,通常为100维。window=5
:指定当前词和预测词之间的最大距离。min_count=1
:指定忽略频率小于1的词。
- 训练模型:通过将分词后的文本数据传入
Word2Vec
模型中,进行训练。
3. 词向量操作
- 计算相似度:使用
model.wv.similarity
计算两个词之间的相似度。 - 获取最相似的词:
model.wv.most_similar
可以找出与给定词最相似的词汇。 - 找到不匹配的词:
model.wv.doesnt_match
用于找出一组词中不属于同一类别的词汇。 - 词频查询:使用
model.wv.get_vecattr
获取特定词的词频信息。