本文一切秉持短小精悍,通俗易懂的思想
一. tf-idf
1.1 思想
词并不是出现次数越多就越重要,原则是出现在越少的文档重要性就越高,向量长度等于词库大小V
词频(term frequency,TF):指的是某一个给定的词语在该文件中出现的频率。
这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否)
逆向文件频率(inverse document frequency,IDF):由总文件数目除以包含该词语之文件的数目,再log得到,是一个词语普遍重要性的度量。
1.2 举例
1.3 代码应用
TfidfTransformer + CountVectorizer = TfidfVectorizer
句子转向量
from sklearn.feature_extraction.text import TfidfVectorizer
cv=TfidfVectorizer(smooth_idf=True,stop_words='english') #smooth默认为true,即idf分母+1
vec=cv.fit_transform(['the moon is so sweet tonight.','wind is also gentle.'])#传入句子组成的list
print(cv.get_feature_names())
arr=vec.toarray()
print(arr)
>>>['gentle', 'moon', 'sweet', 'tonight', 'wind']
>>>[[0. 0.57735027 0.57735027 0.57735027 0. ]
[0.70710678 0. 0. 0. 0.70710678]]
二. word2vec
2.1 思想
2.2 举例
2.3 代码
三. fasttext
2.1 思想
2.2 举例
2.3 代码
四. 三步搞定用lda无监督算法进行分类
2.1 思想
2.2 举例
2.3 代码
datatext是这样的二重list
[['杏林',
'芳菲',
'广东',
'中医药',
'曹磊',
'编著',
'杏林'],
[…],]
from gensim import corpora
from gensim.models import LdaModel
from gensim.corpora import Dictionary
train = datatext
# 1. 将数据dictionaty
dictionary = corpora.Dictionary(train)
corpus = [ dictionary.doc2bow(text) for text in train ]
# 2. 构建模型
num_topics = 33
chunksize = 2000
passes = 20
iterations = 400
eval_every = None # Don't evaluate model perplexity, takes too much time.
lda = LdaModel(
corpus=corpus,
id2word=dictionary,
chunksize=chunksize,
alpha='auto',
eta='auto',
iterations=iterations,
num_topics=num_topics,
passes=passes,
# eval_every=eval_every
)
# 3. 显示分类结果
topic_list=lda.print_topics(33)#33代表全部主题list,还可以是0,1,……,32来指定特定主题
for topic in topic_list:
print(topic)
查看特定文档的分类情况
test_doc=train[2]#文学类
doc_bow = dictionary.doc2bow(test_doc) # 1. 文档转换成bow
doc_lda = lda[doc_bow] # 2. 得到新文档的主题分布
print(doc_lda) #3. 输出新文档的主题分布
print ("-----------------------------------------")
#查看主题词 和分布概率
for topic in doc_lda:
print ("%s\t%f\n"%(lda.print_topic(topic[0]), topic[1]))