赞
踩
gensim 是一个通过衡量词组(或更高级结构,如整句或文档)模式来挖掘文档语义结构的工具
三大核心概念:文集(语料)–>向量–>模型
from gensim import corpora
import jieba
documents = ['工业互联网平台的核心技术是什么',
'工业现场生产过程优化场景有哪些']
def word_cut(doc):
seg = [jieba.lcut(w) for w in doc]
return seg
texts= word_cut(documents)
##为语料库中出现的所有单词分配了一个唯一的整数id
dictionary = corpora.Dictionary(texts)
dictionary.token2id
{'互联网': 0,
'什么': 1,
'优化': 7,
'哪些': 8,
'场景': 9,
'工业': 2,
'平台': 3,
'是': 4,
'有': 10,
'核心技术': 5,
'现场': 11,
'生产': 12,
'的': 6,
'过程': 13}
##该函数doc2bow()只计算每个不同单词的出现次数,将单词转换为整数单词id,并将结果作为稀疏向量返回
bow_corpus = [dictionary.doc2bow(text) for text in texts]
bow_corpus
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
[(2, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1), (13, 1)]]
每个元组的第一项对应词典中符号的 ID,第二项对应该符号出现的次数。
from gensim import models
# train the model
tfidf = models.TfidfModel(bow_corpus)
分词工具
1、python︱六款中文分词模块尝试:jieba、THULAC、SnowNLP、pynlpir、CoreNLP、pyLTP
2、Hanlp
首先要对句子进行初步处理。本文对文本依次进行了【去空去重、切词分词和停用词过滤】操作。
原始数据会存在一些【空或重复的语句】,须过滤掉这些【无价值且影响效率】的语句。使用计算机自动地对中文文本进行词语切分的过程称为中文分词(Chinese Word Segmentation),即使中文句子中的词之间有空格标识。若要对一个句子进行分析,就需要将其切分成词的序列,然后以词为单位进行句子的分析,故中文分词是中文自然语言处理中最基本的一个环节。
生成分词列表
1、首先停用词过滤,返回一个停用词表
可以使用中科院的“计算所汉语词性标记集”以及哈工大停用词表
def StopWordsList(filepath):
wlst = [w.strip() for w in open(filepath,'r',encoding='utf8').readlines()]
return wlst
2、结巴分词后的停用词性 [标点符号、连词、助词、副词、介词、时语素、‘的’、数词、方位词、代词]
stop_flag = ['x', 'c', 'u','d', 'p', 't', 'uj', 'm', 'f', 'r']
对文本集中的文本进行中文分词,返回分词列表
def seg_sentence(sentence,stop_words):
sentence_seged = jieba.cut(sentence.strip())
# sentence_seged = set(sentence_seged)
outstr = ''
for word in sentence_seged:
if word not in stop_words:
if word != '\t':
outstr += word
outstr += ' '
return outstr.split(' ')
#1、将【文本集】生产【分词列表】 texts = [seg_sentence(seg,stop_words) for seg in open(tpath,'r',encoding='utf8').readlines()] #一、建立词袋模型 #2、基于文件集建立【词典】,并提取词典特征数 dictionary = corpora.Dictionary(texts) feature_cnt = len(dictionary.token2id.keys()) #3、基于词典,将【分词列表集】转换为【稀疏向量集】,也就是【语料库】 corpus = [dictionary.doc2bow(text) for text in texts] #二、建立TF-IDF模型 #4、使用“TF-TDF模型”处理【语料库】 tfidf = models.TfidfModel(corpus) #三构建一个query文本,利用词袋模型的字典将其映射到向量空间 #5、同理,用词典把搜索词也转换为稀疏向量 kw_vector = dictionary.doc2bow(seg_sentence(keyword,stop_words)) #6、对稀疏向量建立索引 index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=feature_cnt) #7、相似的计算 sim = index[tfidf[kw_vector]]
全部代码:
import jieba import jieba.posseg as pseg from gensim import corpora, models, similarities def StopWordsList(filepath): wlst = [w.strip() for w in open(filepath, 'r', encoding='utf8').readlines()] return wlst def seg_sentence(sentence, stop_words): # stop_flag = ['x', 'c', 'u', 'd', 'p', 't', 'uj', 'm', 'f', 'r']#过滤数字m stop_flag = ['x', 'c', 'u', 'd', 'p', 't', 'uj', 'f', 'r'] sentence_seged = pseg.cut(sentence) # sentence_seged = set(sentence_seged) outstr = [] for word,flag in sentence_seged: # if word not in stop_words: if word not in stop_words and flag not in stop_flag: outstr.append(word) return outstr if __name__ == '__main__': spPath = 'stopwords.txt' tpath = 'test.txt' stop_words = StopWordsList(spPath) keyword = '吃鸡' # 1、将【文本集】生产【分词列表】 texts = [seg_sentence(seg, stop_words) for seg in open(tpath, 'r', encoding='utf8').readlines()] orig_txt = [seg for seg in open(tpath, 'r', encoding='utf8').readlines()] #一、建立词袋模型 # 2、基于文件集建立【词典】,并提取词典特征数 dictionary = corpora.Dictionary(texts) feature_cnt = len(dictionary.token2id.keys()) # 3、基于词典,将【分词列表集】转换为【稀疏向量集】,也就是【语料库】 corpus = [dictionary.doc2bow(text) for text in texts] # 4、使用“TF-TDF模型”处理【语料库】 #二、建立TF-IDF模型 tfidf = models.TfidfModel(corpus) #三构建一个query文本,利用词袋模型的字典将其映射到向量空间 # 5、同理,用词典把搜索词也转换为稀疏向量 kw_vector = dictionary.doc2bow(seg_sentence(keyword, stop_words)) # 6、对稀疏向量建立索引 index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=feature_cnt) # 7、相似的计算 sim = index[tfidf[kw_vector]] result_list = [] for i in range(len(sim)): print('keyword 与 text%d 相似度为:%.2f' % (i + 1, sim[i])) if sim[i] > 0.4: result_list.append(orig_txt[i]) print('原始的句子:',result_list)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。