1、读入待处理的中文样本数据,正则匹配,清洗数据
data.content = data.content.str.replace("[^\u4e00-\u9fa50-9]","")
# [\u4e00-\u9fa5]正则匹配所有中文 [0-9]正则匹配所有数字
# [\u4e00-\u9fa50-9] 匹配所有中文和所有数字
# [^\u4e00-\u9fa50-9] 匹配非中文和数字的所有字符 , ^代表非
2、停用词+删除各种标点符号
#停用词;'stopwords1.txt', 'stopwords2.txt', 'custom_stopwords.txt是常用停用词txt
import codecs
stopwords_file = ['stopwords1.txt', 'stopwords2.txt', 'custom_stopwords.txt']
stopwords = []
for file in stopwords_file:
with codecs.open('./stopwords/'+file, 'r', encoding='utf-8') as f: #在python3中以utf-8的格式打开若干文本文件,并存储到一个list
stopwords.extend([word.rstrip() for word in f.readlines()])
#标点符号
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('custom_dict.txt') 若有手动标注的,可以增强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('./stopwords/stopwords1.txt') #载入停用词
jieba.analyse.extract_tags(good_content[0],topK=5,withWeight=True,allowPOS=()) #withWeight输出关键词权重
基于textrank的关键词提取
import jieba.analyse
jieba.analyse.set_stop_words('./stopwords/stopwords1.txt')
jieba.analyse.textrank(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 = word_n.groupby(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
假设分词结果被存为segmented0.txt文件
1、词袋 doc2bow
将segmented0存为list
from gensim.corpora 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的tfidf值(可以理解成 将用词频向量表示一句话或分词结果 变换成为用词的重要性向量表示一句话或分词结果)
tfidf = models.TfidfModel(corpus) #统计tfidf
corpus_tfidf = tfidf[corpus] #可以用过print来输出tiidf结果
计算文档相似度 https://www.cnblogs.com/yanzhi-1996/articles/11151480.html
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
https://www.cnblogs.com/fclbky/p/7374238.html
https://blog.csdn.net/Yellow_python/article/details/83097994
from gensim.corpora 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('./stopwords/stopwords1.txt')
jieba.analyse.textrank(good_content[0],topK=5,withWeight=True,allowPOS=())
jieba.analyse.extract_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_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]))查看