NLP之Gensim库探索及中文句子相识度的应用

Gensim是一个免费的Python库,旨在高效的以计算机方式从文档中自动提取语义主题。用Gensim创建整个训练语料库,不需要在任何时候完全存储在RAM中(可以处理大型的网络规模语料库),并在语义库中实现相识度查询。Gensim库围绕三个重要概念:语料库corpus,向量vector和模型model。本文从两部分来理解和使用Gensim,第一步为Gensim基本概念的理解;第二部分是基于Gensim来实现中文相识度比较应用。

第一部分:Gensim基本概念的理解

1、语料库corpus

数字文件的集合。该集合用于自动推断文档的结构及其主题等,集合也称为训练语料库。 这个推断的潜在结构可以用于将主题分配给没有出现在训练语料库中的新文档。 不需要人为干预。

2、向量vector

在向量空间模型(VSM)中,每个文档由一组特征表示。

3、模型model

模型是从一个文档表示到另一个文档表示的转换。 在gensim文档中被表示为向量,所以模型可以被认为是两个向量空间之间的变换。 这种变革的细节从训练语料库中学到。其中可用的模型算法包括Tf-Idf算法分布式增量潜在语义分析(LSA)分布式增量潜在Dirichlet分配(LDA)随机投影的几种流行向量空间算法。其中算法原理是通过检查训练文档语料库中的单词的统计共现模式,发现文档的语义结构。一旦发现这些统计模式,任何纯文本文件都可以用新的语义表示简洁地表达,并查询与其他文档的局部相似性。这些算法是无监督学习算法。

第二部分:基于Gensim实现中文句子相识度判断应用

1、参考代码:

# -*- coding:utf-8 -*-
import codecs
from gensim import corpora, models, similarities
import jieba

train_set=r"testSet/trainSet.txt"    #训练数据集
test_set=r"testSet/testSet1.txt"     #测试数据集
stopword_filepath="stopwordList/stopword.txt"   #停用词数据集

# 按行读入数据,返回一个List
def read_lines(filepath):
sentences = []
file_obj = codecs.open(filepath, 'r', 'utf-8')
while True:
line = file_obj.readline()
line = line.strip('\r\n')
if not line:
break
sentences.append(line)
file_obj.close()
return sentences

# 读取停用词文件,将数据放到一个列表数组中
def read_in_stopword():
stopwords = []
file_obj = codecs.open(stopword_filepath, 'r', 'utf-8')
while True:
line = file_obj.readline()
line = line.strip('\r\n')
if not line:
break
stopwords.append(line)
file_obj.close()
return stopwords

# 获取切过词的句子
def get_cuted_sentences(sentences):
cuted_sentences = []
for sentence in sentences:
result_value = cut_for_search(sentence[0])
cuted_sentences.append(result_value)
return cuted_sentences

# 去掉停用词
def cut_for_search(sentence, stopword=True):
seg_list = jieba.cut_for_search(sentence)   # 对句子分词
stopwords = read_in_stopword()              #获取停用词
results = []
for seg in seg_list:
if seg in stopwords and stopword:
continue
results.append(seg)
return results

# 步骤一:从文件中读取数据(训练集合和测试集合)
# 读入训练集
train_sentences = read_lines(train_set)  #返回一个列表
# 读入测试集
test1_sentences = read_lines(test_set)  #返回一个列表

# 步骤二:通过gensim构建模型
# 将训练数据进行合并和分词,放到一个列表中
sentences = []     #将所有的句子放到一个List列表中
for i in range(0, len(train_sentences)):
sentences.append((train_sentences[i], i, i))

# 创建tfidf模型
texts = get_cuted_sentences(sentences)      #将句子切分成词语
dictionary = corpora.Dictionary(texts)      # 把词丢进来
corpus_simple = [dictionary.doc2bow(text) for text in texts]
model = models.TfidfModel(corpus_simple)
corpus = model[corpus_simple]

# 创建相似度矩阵
index = similarities.MatrixSimilarity(corpus)

# 步骤三:用测试数据测试模型的准确度
# 测试数据
right_count = 0
for i in range(0,len(train_sentences)):
text_result = cut_for_search(test1_sentences[i])
vec_bow = dictionary.doc2bow(text_result)
sims = index[model[vec_bow]]
sim = max(enumerate(sims), key=lambda item: item[1])
if i != sim[0]:
print (str(i) + " wrong! score: " + str(sim[1]))
else:
right_count += 1
print (str(i) + " right! score: " + str(sim[1]))
print ("正确率为: " + str(float(right_count)/len(train_sentences)))

程序位置:G:\京东多轮对话系统挑战赛\sentenceSimilarity\tfidfSimilarityWithGensim.py

2、运行结果:

0 right! score: 0.79155606

1 right! score: 0.9029925

2 right! score: 0.8966945

3 right! score: 0.7726042

4 right! score: 0.73523957

5 wrong! score: 0.2590444

6 right! score: 0.81394446

7 right! score: 0.93894815

8 right! score: 0.8660254

9 right! score: 0.7988874

10 right! score: 0.71343005

11 right! score: 0.8860738

12 right! score: 0.6816159

13 right! score: 0.8164966

14 right! score: 0.92760336

15 right! score: 1.0

16 right! score: 0.6670321

17 right! score: 0.71800923

18 right! score: 0.7778934

19 right! score: 0.89903224

20 right! score: 0.69070405

21 right! score: 0.81569827

22 right! score: 0.4802834

23 right! score: 0.664884

24 right! score: 0.7760572

正确率为: 0.96

第三部分:参考网址:

https://blog.csdn.net/m0_37306360/article/details/76817040

Gensim官网指南:https://radimrehurek.com/gensim/tutorial.html
GensimJpython网址:

https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/Corpora_and_Vector_Spaces.ipynb
Gensim API参考网址:https://radimrehurek.com/gensim/apiref.html

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: