分词(jieba)_词向量词袋(doc2bow_tfidf_)_主题模型
(lda_lsi)。。。
分词:
1、读⼊待处理的中⽂样本数据,正则匹配,清洗数据
# [\u4e00-\u9fa5]正则匹配所有中⽂ [0-9]正则匹配所有数字
# [\u4e00-\u9fa50-9] 匹配所有中⽂和所有数字
# [^\u4e00-\u9fa50-9] 匹配⾮中⽂和数字的所有字符 , ^代表⾮
2、停⽤词+删除各种标点符号
#停⽤词;'', '', '是常⽤停⽤词txt
import codecs
stopwords_file = ['', '', '']
stopwords = []
for file in stopwords_file:
with codecs.open('./stopwords/'+file, 'r', encoding='utf-8') as f: #在python3中以utf-8的格式打开若⼲⽂本⽂件,并存储到⼀个list
#标点符号
import string
eng_punc = string.punctuation # string.punctuation是打印了字符串中所有标点 zh_punc定义了个性化标点 punc结合了两者。
zh_punc = '!,。、‘’“”【】|·¥……()? '
punc = eng_punc + zh_punc
3、根据停⽤词、标签符号,以及使⽤增强过的jieba分词,按照词性保留想要的分词结果
def by_cut(data, pos=None): #pos是词性的意思
import jieba
#jieba.load_userdict('') 若有⼿动标注的,可以增强jieba分词能⼒
import jieba.posseg as pseg
res = []
for line in data:
try:
segs = pseg.cut(line)
for word, p in segs: #word是对line分割过后的短句;p是对每个短句词性的标注;p[0]就是第⼀个词的词性
# print(seg)
if p[0] in pos and word not in stopwords and word not in punc and word != '\n':
res.append(word)
except:
print(line)
continue
return res
4、jieba_其他
利⽤调节词频,使得“⼩⽕车“可以被分出来
jieba.suggest_freq(("⼩⽕车"), tune = True)
基于tf-idf的关键词提取
import jieba.analyse
jieba.analyse.set_stop_words('./') #载⼊停⽤词
weight是什么词act_tags(good_content[0],topK=5,withWeight=True,allowPOS=()) #withWeight输出关键词权重
基于textrank的关键词提取
import jieba.analyse
jieba.analyse.set_stop_words('./')
ank(good_content[0],topK=5,withWeight=True,allowPOS=())
只是⽤jieba.cut()分词时,可以选择hmm模型的介⼊,并且可以调节cut_all(全模式,精确模式(适合⽂本分析),搜索引擎模式);但是想要通过根据词性调整输出分词,则⽆法调整hmm的分词模式。
5、jieba的词云可视化echarts
good_n = by_cut(good_content, pos=('n'))
word_n = pd.DataFrame(good_n, columns=['word'])
wordcount_n = upby(by=['word'])['word'].count() #对dataframe中的某列统计词频
wordcount_n = wordcount_n.sort_values(ascending=False) #从⼤到⼩排序
from pyecharts import WordCloud
wordcloud1 = WordCloud(width=500, height=500)
wordcloud1.add(name = "初次好评",
attr = wordcount_n.index[:100],
value = wordcount_n.values[:100],
word_size_range = [20,100])
wordcloud1
词袋&词向量
假设分词结果被存为⽂件
1、词袋 doc2bow
将segmented0存为list
pora import Dictionary
from gensim import corpora, models
dicts = corpora.Dictionary(segmented0)
corpus = [dict.doc2bow(text) for text in segmented0]
for word,index in dicts .token2id.iteritems():
print word +" 编号为:"+ str(index) #可以看到每个词、词组在字典中的编号
语料(Corpus):⼀组原始⽂本的集合,⽤于⽆监督地训练⽂本主题的隐层结构。语料中不需要⼈⼯标注的附加信息。在Gensim 中,Corpus通常是⼀个可迭代的对象(⽐如列表)。每⼀次迭代返回⼀个可⽤于表达⽂本对象的稀疏向量d
TF-IDF变换:评估⼀字词对于⼀个⽂件集或⼀个语料库中的其中⼀份⽂件的重要程度。字词的重要性随
着它在⽂件中出现的次数成正⽐增加,但同时会随着它在中出现的频率成反⽐下降。)
计算词袋语料corpus的tfidf值(可以理解成 将⽤词频向量表⽰⼀句话或分词结果 变换成为⽤词的重要性向量表⽰⼀句话或分词结果)
tfidf = models.TfidfModel(corpus) #统计tfidf
corpus_tfidf = tfidf[corpus] #可以⽤过print来输出tiidf结果
lsi_model = models.LsiModel(corpus,id2word=dict,num_topics=2)
documents = lsi_model[corpus]
index = similarities.MatrixSimilarity(documents)
index是基于corpus词袋和lsi模型训练出的相似度矩阵,如果需要对新样本query计算与corpus中的相似度,需要先将query进⾏词袋、tfidf、lsi_model处理后使⽤index[query]计算
query = [(0,1),(2,1)] #query是词袋后的结果
print(list(enumerate(index[lsi_model[query]]))) #输出query词袋代表的⽂本,与所有参与lsi训练⽂本的相
似度
2、词向量 word2vec;doc2vec
主题模型
基于genism的主题模型使⽤:LDA,LSI
pora import Dictionary
from gensim import corpora, models, similarities
'''
step1:使⽤jieba分词
jieba分词的三种⽅法:
① 使⽤隐马尔科夫模型,有三种模式调整(全模式,精确模型(适合⽂本分析),搜索引擎模式)
jieba.cut()
② 使⽤hmm模型,可以根据词性分词(分词地址时,可以选择名词)
import jieba.posseg as pseg
segs = pseg.cut()
for word,p in segs:
print(word,p)
③ 基于tf-idf/textrank计算分词重要性,进⾏关键词提取
import jieba.analyse
jieba.analyse.set_stop_words('./')
ank(good_content[0],topK=5,withWeight=True,allowPOS=())
act_tags(good_content[0],topK=5,withWeight=True,allowPOS=())
在使⽤jieba分词的时候,注意使⽤正则表达、str字符,去掉字符,使⽤停⽤词和⼈⼯标字典提⾼分词能⼒。
step2:使⽤词袋模型、词向量模型
常⽤的词袋模型:doc2bow 将⽂本按出现的频次处理为向量
常⽤的词向量模型:word2vec/doc2vec
tf-idf模型:将词袋模型的结果,从词或词组的出现频次向量转换为词或词组出现的重要性向量
step3:主题模型;使⽤词袋向量化后并使⽤tf-idf计算后的词组重要性向量进⾏主题模型建模(⽆监督学习)
LDA主题模型:
LSI主题模型:
训练好主题模型后:
①可以对每个⽂本⽣成所属的主题类型,并⽣成该主题的关键词及权重
②固化主题模型的相似矩阵,对新样本计算与其相似的样本
'''
#segmented0是jieba分词后的结果;属性:list
dicts = corpora.Dictionary(segmented0)
corpus = [dict.doc2bow(text) for text in segmented0] #segmented0是jieba分词后的结果
tfidf = models.TfidfModel(corpus) #统计tfidf
corpus_tfidf = tfidf[corpus] #可以通过 for doc in corpus_tfidf: print doc 与segmented0⽐较tfidf汉字后的区别lsi_model = models.LsiModel(corpus,id2word=dicts,num_topics=2)
lda_model = models.LdaModel(corpus,id2word=dicts,num_topics=2)#LDA的结果每次都在变化
lsi_modeol.print_topics(2)#输出两个主题
#将⽂本投影到主题空间中(查看每个⽂本属于哪个主题的概率)
corpus_lsi = lsi_model[corpus_tfidf]
for doc in corpus_lsi:
print(doc)
#输⼊⼀句话,查询属于LSI、LDA得到的哪个主题类型
index = similarities.MatrixSimilarity(lsi_model[corpus])
index = similarities.MatrixSimilarity(lda_model[corpus])
query = "杭州市阿⾥巴巴"
query_bow = dicts.doc2bow(list(jieba.cut(query)))
query_bow = dicts.doc2bow(list(jieba.cut(query)))
query_lsi = lsi_model[query_bow]
query_lda = lda_model[query_bow]
print(query_lda)
#输⼊⼀句话,⽐较和第⼏句话相似,⽤LSI得到的索引接着做,并排序输出sims = index[query_lsi]
print list(enumerate(sims))
sort_sims = sorted(enumerate(sims), key=lambda item: -item[1]) print sort_sims
#计算⽂本相似度
#先根据训练的⽂本固话⼀个相似矩阵
#将待计算相似度的⽂本样本,进⾏jieba分词并doc2bow词袋
#使⽤print(list(index[tf-idf_test]))查看
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论