文本挖掘:如何通过人工智能将文本(例如新闻文章)聚类?


15

我为不同的任务建立了一些神经网络(MLP(完全连接),Elman(递归)),例如打Pong,对手写数字和东西进行分类...

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

对于文本挖掘(例如新闻报道),您需要不断变化的输入大小(不同的单词,不同的句子,不同的文本长度等)。

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

不幸的是,我无法找到简单的入门教程。复杂的科学论文难以阅读,也不是学习主题的最佳选择(就我个人而言)。我已经阅读了很多有关MLP,辍学技术,卷积神经网络等的论文,但是我找不到关于文本挖掘的基础文章-对于我非常有限的文本挖掘技能来说,我发现的水平太高了。

Answers:


12

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

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

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

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

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

2
在NLP文献中,LDA似乎是指潜在Dirichlet分析。在这些文献中,线性判别分析没有用吗?
2015年

确实,在我们的案例中,LDA是潜在的Dirichlet分配。
Yannis Assael 2015年

5

除了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

您还可以应用非负矩阵分解,这可以解释为聚类。您需要做的就是在转换后的空间中获取每个文档的最大部分,并将其用作集群分配。

在sklearn中:

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

您如何获得每个群集的热门词汇?
Mayukh Nair

3

LSA + KMeans可以很好地工作,但是您必须输入期望的集群数量。此外,发现的簇的轮廓系数通常很低。

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

我还发现使用提取器(例如Snowball for ex)非常重要,这样可以减少由于错别字引起的错误。如果您要确保摆脱一些没有意义的类群,那么一个良好的停用词列表也非常重要,这些类群由于常见单词的大量出现而没有重要意义。在建立计数矩阵时,归一化也很重要,它可以为数据集上出现率较低但特定样本中出现率较高的单词增加权重。这些话很有意义,您不想错过它们。它还降低了在所有特定样本中出现频率较高的单词的权重(接近停用词,但对于可能含义不大的单词)。我注意到的最后一件事很重要,那就是不要打印群集中的前10个单词,而是要进行更多的选择。通常,关键字的质量和与标签相关的质量会在排名前10-20个字之后急剧下降。因此,对热门关键词的扩展视图将帮助您分析您的集群是否确实相关或被噪声严重污染。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.