GuidedLDA详解

tech2022-09-30  71

一、 简介

GuidedLDA 是可选半监督主题识别算法,所谓“可选”意思是自定义的主题可以有选择的传入模型中,不传的话,就和LDA一样了。

二、安装

pip install guidedlda # 其他依赖包 pip install numpy pip install Cython pip install pbr

注意:guidedlda是基于C语言实现的模型,mac电脑不能识别其中的后缀为.so的文件,我这边没有安装成功,由于只有mac电脑,无奈使用docker镜像模拟linux环境使用该算法。 这里提供一下源码:https://github.com/vi3k6i5/GuidedLDA

三、数据准备

X = guidedlda.datasets.load_data(guidedlda.datasets.NYT)

这是官方提供的获取数据的方法,guidedlda.datasets.NYT中的数据格式为 索引:个数的形式,这里“索引”是指词在词典中的位置,“个数”是预料中该词出现的次数,词典如何生成下面会讲。训练数据如下图一: 但是我们自己的数据都是文本格式的,首先要转化为以上格式才能使用官方提供的获取数据的方法,与其转化为这种格式,不如直接把数据处理成最终的模型输入的格式,如下图二: 是一个numpy.array格式的数据。 看上图数据格式,就是把图一中的数据扩展为n*m维,n指数据条数,m为字典长度。比如图一中第一行1:2 对应图二中第一行中的2,就是索引为1,值为2。 现在我们已经很清楚了输入的数据格式,那我们怎么样才能转换为这种格式呢? 首先我们要有一个字典,这里我们根据训练语料进行分词形成一个字典。 字典格式为 词:个数

pip install pickle vocab = dict() vocab['bak'] = 0 with open(vocab_path, 'wb') as f: for sent in sentences: for se in str(sent).split(): vocab[se] = vocab.get(se, 0) + 1 pickle.dump(vocab, f) f.close()

这里的sentences是分词后的结果。为了后续使用,这里存储了字典。 下面就转化一下数据:

# 读取字典 with open(vocab_path, 'rb') as f: vocab = pickle.load(f) f.close() # 形成词在字典中的索引字典 word2id = dict((v, idx) for idx, v in enumerate(vocab)) # 读取训练数据 with open(train_data_path, 'r') as f: lines = f.readlines() f.close() # 构建上文提到的n*m全零矩阵 sentences = np.zeros((len(lines), len(list(word2id.keys())))) # 赋值 for i, line in enumerate(lines): for j, word in enumerate(line.split()): sentences[i][word2id.get(word, 0)] = vocab.get(word, 0) # 最后的入参数据 X = sentences.astype(np.int64)

下面就是GuidedLDA最主要的参数,seed_topics 种子话题,即我们自定义的话题相关词

seed_topic_list = [['价格', '多少钱', '单价', '均价', '便宜', '优惠', '万左右'], ['微信', '打电话', '联系', '电话', '手机号', '时间'], ['楼房', '楼层', '车库', '住宅', '产权', '洋房', '新房', '高层'], ['位置', '哪里', '售楼处', '小区']]

我这里定义了4个话题,需要把他们转化为模型能够读取的格式:

# 字典索引:话题索引 seed_topics = {} for t_id, st in enumerate(seed_topic_list): for word in st: seed_topics[word2id[word]] = t_id

四、训练模型

import guidedlda model = guidedlda.GuidedLDA(n_topics=4, n_iter=100, random_state=7, refresh=20) model.fit(X, seed_topics=seed_topics, seed_confidence=0.15) with open('../model/guidedlda_seed.model', 'wb') as f: pickle.dump(model, f) f.close()

模型输出: 查看话题

vocab = tuple(vocab.keys()) topic_word = model.topic_word_ n_top_words = 8 for i, topic_dist in enumerate(topic_word): topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n_top_words+1):-1] print('Topic {}: {}'.format(i, ' '.join(topic_words)))

查看文本分配的话题:

doc_topic = model.transform(X) print('数据条数:{}'.format(len(doc_topic))) for i in range(9): print("top topic: {} Document: {}".format(doc_topic[i].argmax(),lines[i])

好了,模型就讲解到这,有疑问的小伙伴可以私我,感觉有帮助的话,麻烦点个赞撒,也可关注我的微信公众号,内有许多NLP相关算法原理讲解,一起讨论,打怪升级吧。

最后再说一句,如果有论文模型代实现需求的朋友,可以私我,我们好好聊聊

最新回复(0)