文本挖掘:如何用人工智能对文本(例如新闻文章)进行聚类?

机器算法验证 聚类 神经网络 特征选择 文本挖掘 自组织图
2022-02-05 09:10:52

我已经为不同的任务构建了一些神经网络(MLP(全连接)、Elman(循环)),比如打乒乓球、对手写数字进行分类等等……

此外,我尝试构建一些第一个卷积神经网络,例如用于对多位手写笔记进行分类,但我对分析和聚类文本是全新的,例如在图像识别/聚类任务中,可以依赖标准化输入,例如 25x25 大小的图像, RGB 或灰度等......有很多预先假设的功能。

对于文本挖掘,例如新闻文章,您有不断变化的输入大小(不同的单词、不同的句子、不同的文本长度……)。

如何利用人工智能(最好是神经网络/SOM)实现现代文本挖掘工具?

不幸的是,我找不到简单的入门教程。复杂的科学论文很难阅读,也不是学习主题的最佳选择(在我看来)。我已经阅读了很多关于 MLP、dropout 技术、卷积神经网络等的论文,但是我无法找到一篇关于文本挖掘的基本论文——我发现的所有内容对于我非常有限的文本挖掘技能来说都太高了。

4个回答

潜在狄利克雷分配 (LDA) 很棒,但如果你想要更好的使用神经网络的东西,我强烈建议使用 doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html )。

它能做什么?它的工作原理与 Google 的 word2vec 类似,但不是单个单词特征向量,而是一个段落的特征向量。该方法基于skip-gram模型和神经网络,被认为是提取文档特征向量的最佳方法之一。

现在有了这个向量,您可以运行 k-means 聚类(或任何其他优选算法)并对结果进行聚类。

最后,要提取特征向量,您可以这样做:

from gensim.models import Doc2Vec
from gensim.models.doc2vec import LabeledSentence

class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename
    def __iter__(self):
        for uid, line in enumerate(open(self.filename)):
            yield LabeledSentence(words=line.split(), labels=['TXT_%s' % uid])


sentences = LabeledLineSentence('your_text.txt')

model = Doc2Vec(alpha=0.025, min_alpha=0.025, size=50, window=5, min_count=5,
                dm=1, workers=8, sample=1e-5)

model.build_vocab(sentences)

for epoch in range(500):
    try:
        print 'epoch %d' % (epoch)
        model.train(sentences)
        model.alpha *= 0.99
        model.min_alpha = model.alpha
    except (KeyboardInterrupt, SystemExit):
        break

除了 LDA,您还可以使用带有K-Means 的潜在语义分析它不是神经网络,而是“经典”聚类,但效果很好。

sklearn 中的示例(取自此处):

dataset = fetch_20newsgroups(subset='all', shuffle=True, random_state=42)
labels = dataset.target
true_k = np.unique(labels).shape[0]

vectorizer = TfidfTransformer()
X = vectorizer.fit_transform(dataset.data)

svd = TruncatedSVD(true_k)
lsa = make_pipeline(svd, Normalizer(copy=False))

X = lsa.fit_transform(X)

km = KMeans(n_clusters=true_k, init='k-means++', max_iter=100)
km.fit(X)

现在集群分配标签可用于km.labels_

例如,这些是从 20 个带有 LSA 的新闻组中提取的主题:

Cluster 0:  space  shuttle  alaska  edu  nasa  moon  launch  orbit  henry  sci
Cluster 1:  edu  game  team  games  year  ca  university  players  hockey  baseball
Cluster 2:  sale  00  edu  10  offer  new  distribution  subject  lines  shipping
Cluster 3:  israel  israeli  jews  arab  jewish  arabs  edu  jake  peace  israelis
Cluster 4:  cmu  andrew  org  com  stratus  edu  mellon  carnegie  pittsburgh  pa
Cluster 5:  god  jesus  christian  bible  church  christ  christians  people  edu  believe
Cluster 6:  drive  scsi  card  edu  mac  disk  ide  bus  pc  apple
Cluster 7:  com  ca  hp  subject  edu  lines  organization  writes  article  like
Cluster 8:  car  cars  com  edu  engine  ford  new  dealer  just  oil
Cluster 9:  sun  monitor  com  video  edu  vga  east  card  monitors  microsystems
Cluster 10:  nasa  gov  jpl  larc  gsfc  jsc  center  fnal  article  writes
Cluster 11:  windows  dos  file  edu  ms  files  program  os  com  use
Cluster 12:  netcom  com  edu  cramer  fbi  sandvik  408  writes  article  people
Cluster 13:  armenian  turkish  armenians  armenia  serdar  argic  turks  turkey  genocide  soviet
Cluster 14:  uiuc  cso  edu  illinois  urbana  uxa  university  writes  news  cobb
Cluster 15:  edu  cs  university  posting  host  nntp  state  subject  organization  lines
Cluster 16:  uk  ac  window  mit  server  lines  subject  university  com  edu
Cluster 17:  caltech  edu  keith  gatech  technology  institute  prism  morality  sgi  livesey
Cluster 18:  key  clipper  chip  encryption  com  keys  escrow  government  algorithm  des
Cluster 19:  people  edu  gun  com  government  don  like  think  just  access

您还可以应用Non-Negative Matrix Factorization,这可以解释为聚类。您需要做的就是在转换后的空间中获取每个文档的最大组件 - 并将其用作集群分配。

在 sklearn 中:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)

LSA+KMeans 效果很好,但您必须输入您期望的集群数量。此外,发现的簇的轮廓系数通常较低。

我获得更好结果的另一种方法是在此处使用 DBSCAN示例它寻找高密度的中心并扩展以形成集群。在这种方法中,它会自动找到最佳数量的集群。

我还发现使用词干分析器非常重要,例如 Snowball for ex,它可以减少由于拼写错误而导致的错误。一个好的停用词列表也非常重要,如果你想确保摆脱一些没有意义的集群,因为没有重要意义的常见词的出现率很高。在构建计数矩阵时,归一化也很重要,它允许为数据集上出现率低但在特定样本中出现率高的单词添加权重。这些话很有意义,你不想错过它们。它还降低了所有特定样本中出现率高的词的权重(接近停用词,但对于可能有一点意义的词)。我注意到的最后一件事很重要,不是打印集群的前 10 个单词,而是更广泛的选择。通常,在这些前 10 到 20 个单词之后,关键字与您给集群的标签的质量和相关性往往会显着降低。因此,顶级关键字的扩展视图将帮助您分析您的集群是否真的相关或受到噪音的严重污染。

我最喜欢的方法是LDA您可以在此处查找使用 python 包的教程。

您还可以查看像这样更简单的方法。