招聘网站开发程序员做国外订单的网站
news/
2025/9/26 11:27:24/
文章来源:
招聘网站开发程序员,做国外订单的网站,珠宝网站建商台北,做运营常用的网站环境
Python3#xff0c;
gensim#xff0c;jieba#xff0c;numpy #xff0c;pandas
原理#xff1a;文章转成向量#xff0c;然后在计算两个向量的余弦值。
Gensim
gensim是一个python的自然语言处理库#xff0c;能够将文档根据TF-IDF, LDA, LSI 等模型转化成向量模…环境
Python3
gensimjiebanumpy pandas
原理文章转成向量然后在计算两个向量的余弦值。
Gensim
gensim是一个python的自然语言处理库能够将文档根据TF-IDF, LDA, LSI 等模型转化成向量模式gensim还实现了word2vec功能以便进行进一步的处理。
中文分词
中文需要分词英文就不需要了分词用的 jieba 。
def segment(doc: str):
中文分词
Arguments:
doc {str} -- 输入文本
Returns:
[type] -- [description]# 停用词
stop_words pd.read_csv(./data/stopwords_TUH.txt, index_colFalse, quoting3,
names[stopword],
sep\n,
encodingutf-8)
stop_words list(stop_words.stopword)
# 去掉html标签数字等
reg_html re.compile(r[^], re.S)
doc reg_html.sub(, doc)
doc re.sub([-], , doc)
doc re.sub(\s, , doc)
word_list list(jieba.cut(doc))
out_str
for word in word_list:
if word not in stop_words:
out_str word
out_str
segments out_str.split(sep )
return segments
训练 Doc2Vec 模型
模型参数下面说明先上代码
def train():
训练 Doc2Vec 模型# 先把所有文档的路径存进一个 array中docLabels
data_dir ./data/corpus_words
docLabels [f for f in listdir(data_dir) if f.endswith(.txt)]
data []
for doc in docLabels:
ws open(data_dir / doc, r, encodingUTF-8).read()
data.append(ws)
print(len(data))
# 训练 Doc2Vec并保存模型
sentences LabeledLineSentence(data, docLabels)
# 实例化一个模型
model gensim.models.Doc2Vec(vector_size256, window10, min_count5,
workers4, alpha0.025, min_alpha0.025, epochs12)
model.build_vocab(sentences)
print(开始训练...)
# 训练模型
model.train(sentences, total_examplesmodel.corpus_count, epochs12)
model.save(./models/doc2vec.model)
print(model saved)
保存成功后会有三个文件分别是doc2vec.modeldoc2vec.model.trainables.syn1neg.npydoc2vec.model.wv.vectors.npy
Doc2Vec参数说明
· vector_size是指特征向量的维度默认为100。大的size需要更多的训练数据,但是效果会更好.
· window表示当前词与预测词在一个句子中的最大距离是多少
· alpha: 是学习速率
· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
· workers参数控制训练的并行数。
· epochs 迭代次数默认为5
文本转换成向量
利用之前保存的模型把分词后的分本转成向量代码如下
def sent2vec(model, words):
文本转换成向量
Arguments:
model {[type]} -- Doc2Vec 模型
words {[type]} -- 分词后的文本
Returns:
[type] -- 向量数组vect_list []
for w in words:
try:
vect_list.append(model.wv[w])
except:
continue
vect_list np.array(vect_list)
vect vect_list.sum(axis0)
return vect / np.sqrt((vect ** 2).sum())
计算两个向量余弦值
余弦相似度又称为余弦相似性是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值绘制到向量空间中如最常见的二维空间。
余弦值的范围在[-1,1]之间值越趋近于1代表两个向量的方向越接近越趋近于-1他们的方向越相反接近于0表示两个向量近乎于正交。
最常见的应用就是计算文本相似度。将两个文本根据他们词建立两个向量计算这两个向量的余弦值就可以知道两个文本在统计学方法中他们的相似度情况。实践证明这是一个非常有效的方法。
公式
def similarity(a_vect, b_vect):
计算两个向量余弦值
Arguments:
a_vect {[type]} -- a 向量
b_vect {[type]} -- b 向量
Returns:
[type] -- [description]dot_val 0.0
a_norm 0.0
b_norm 0.0
cos None
for a, b in zip(a_vect, b_vect):
dot_val a*b
a_norm a**2
b_norm b**2
if a_norm 0.0 or b_norm 0.0:
cos -1
else:
cos dot_val / ((a_norm*b_norm)**0.5)
return cos
预测
def test_model():
print(load model)
model gensim.models.Doc2Vec.load(‘./models/doc2vec.model‘)
st1 open(./data/courpus_test/t1.txt, r, encodingUTF-8).read()
st2 open(./data/courpus_test/t2.txt, r, encodingUTF-8).read()
# 分词
print(segment)
st1 segment(st1)
st2 segment(st2)
# 转成句子向量
vect1 sent2vec(model, st1)
vect2 sent2vec(model, st2)
# 查看变量占用空间大小
import sys
print(sys.getsizeof(vect1))
print(sys.getsizeof(vect2))
cos similarity(vect1, vect2)
print(相似度{:.4f}.format(cos))
看下效果
完全相同的文章不相同的文章数据太大没有上传自己网上找找应该有很多。
参考
原文地址https://www.cnblogs.com/JreeyQi/p/9042397.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918182.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!