1 引言
自然语言处理NLP的主要应用之一是自动从大量非结构化文本中提取人们正在讨论的话题。一些大型文本的例子可以是来自社交媒体的讨论,客户对酒店、电影等的评论,用户的反馈,新闻报道,客户投诉的电子邮件等。知道人们在谈论什么,了解他们的问题和意见,对企业和管理者都非常有价值。而要人工阅读如此大量的话题,并将其整理出来,确实很难。因此需要一个自动算法,能够读懂文本文档,自动输出讨论的话题。
Topic Modeling主题建模是一种从大量非结构化文本中提取隐藏主题的技术。Latent Dirichlet Allocation(LDA)是其中一种流行的主题建模算法。不过面临的挑战是如何提取出清晰、分离和有意义的高质量主题,这在很大程度上取决于文本预处理的质量和寻找最佳主题数量的策略。这个笔记以Rocscience 2021用户会议论文为例,讨论了LDA的应用。
2 数据集准备
Rocscience是一家以多伦多大学为背景的岩土工程软件公司,过去25年发展出许多高质量的工业标准的岩土工程软件,在世界范围内广为使用。Rocscience定于2021年召开用户会议(目前多伦多疫情非常严重,估计会议开不成了),为此收集了100篇论文。我们以这100篇论文的题目作为一个小型的数据集来测试LDA,试图检查用户最关心的应用领域。理论上来说,这种检查对于大型软件公司是有益处的,可以分析出用户对哪类软件和技术更有兴趣,从而调整软件开发策略,最大限度满足用户需求。
3 LDA的工作机理
LDA的主题建模方法的本质是寻找文档内的关键词分布,主题无非就是典型关键词的**。通过关键词的聚合,就可以确定这个主题内容,如下图所示。当我们知道左面的关键词**后,便可以推断出讨论的主题。
为了从大量文本中有效地分离出主题,必须注意以个关键因素:
(1) 数据集的质量;
(2) 数据集中谈论主题的多样性;
(3) 主题建模算法的选择;
(4) 输入算法的话题数量;
(5) 算法的调整参数。
完成一个LDA分析的主要步骤如下:
(1) 加载输入数据;
with open('rocscience.txt','r', encoding='utf-8') as outfile:
_c = outfile.read()
docs = [i for i in _c.split('\n')]
(2) 预处理数据;
docs = [[token for token in doc if len(token) > 1] for doc in docs]
(3) 把文档数据转化为词袋矢量(bag-of-words vectors);
corpus = [dictionary.doc2bow(doc) for doc in docs]
(4) 训练LDA模型。
model = LdaModel(
corpus=corpus,
id2word=id2word,
chunksize=chunksize,
alpha='auto',
eta='auto',
iterations=iterations,
num_topics=num_topics,
passes=passes,
eval_every=eval_every
)
top_topics = model.top_topics(corpus)
3 LDA结果输出
在这个试验中我们取出三个topic:
(1) 这个主题显示出使用有限元进行边坡和隧道开挖的稳定性分析。
(2) 这个主题显示出使用3D数值模拟分析金属矿的边坡稳定性。
(3) 这个主题显示出概率分析在沉降评价和边坡设计中的应用。
4 k-mean聚合
k-mean聚合使用了Transformer算法。
clustering_model = KMeans(n_clusters=num_clusters)
clustering_model.fit(corpus_embeddings)
cluster_assignment = clustering_model.labels_
主要结论如下:
(1) 3D数值模拟成为主流(3D);
(2) 地下开挖是主要的应用领域(Tunnel);
(3) 概率分析是岩土工程的风险评价趋势(Probabilistic)