Text Mining: как кластеризовать тексты (например, новостные статьи) с помощью искусственного интеллекта?

15

Я построил некоторые нейронные сети (MLP (полностью подключенные), Elman (рекуррентные)) для различных задач, таких как игра в понг, классификация рукописных цифр и прочее ...

Кроме того, я попытался создать несколько первых сверточных нейронных сетей, например, для классификации многозначных рукописных заметок, но я совершенно новичок в анализе и кластеризации текстов, например, в задачах распознавания / кластеризации изображений можно полагаться на стандартизированный ввод, например изображения размером 25x25, RGB или оттенки серого и т. Д. ... Есть много предварительных предположений.

Для интеллектуального анализа текста, например, новостных статей, у вас постоянно меняется размер ввода (разные слова, разные предложения, разная длина текста, ...).

Как реализовать современный инструмент для анализа текста, использующий искусственный интеллект, предпочтительно нейронные сети / SOM?

К сожалению, мне не удалось найти простые учебники для начала. Сложные научные труды трудно читать, и это не лучший вариант для изучения темы (на мой взгляд). Я уже прочитал довольно много статей о MLP, методах отсева, сверточных нейронных сетях и т. Д., Но я не смог найти основную информацию о интеллектуальном анализе текста - все, что я нашел, было слишком высоким уровнем для моих очень ограниченных навыков интеллектуального анализа текста.

daniel451
источник

Ответы:

12

Скрытое распределение Дирихле (LDA) - это здорово, но если вы хотите что-то лучше, использующее нейронные сети, я настоятельно рекомендую doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ).

Что оно делает? Он работает аналогично слову word2vec от Google, но вместо одного векторного признака объекта вы получаете векторный вектор абзаца. Метод основан на модели скип-граммы и нейронных сетях и считается одним из лучших методов для выделения вектора признаков для документов.

Теперь, когда у вас есть этот вектор, вы можете запустить кластеризацию 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
Похоже, что в литературе НЛП LDA относится к латентному анализу Дирихле. В этой литературе линейный дискриминантный анализ не имеет смысла?
Сид
Именно LDA в нашем случае является скрытым распределением Дирихле.
Яннис Ассаэль
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

Вы также можете применить факторизацию неотрицательной матрицы , которую можно интерпретировать как кластеризацию. Все, что вам нужно сделать, это взять самый большой компонент каждого документа в преобразованном пространстве - и использовать его как назначение кластера.

В склеарне:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)
Алексей Григорьев
источник
Как вы получили лучшие слова для каждого кластера?
Маюх Наир
3

LSA + KMeans работает хорошо, но вы должны ввести количество ожидаемых кластеров. Кроме того, коэффициент силуэта найденных скоплений обычно низок.

Другой метод, с помощью которого я получаю лучшие результаты, - использовать пример DBSCAN . Он ищет центры высокой плотности и расширяется, образуя кластеры. В этом методе он автоматически находит оптимальное количество кластеров.

Я также обнаружил, что очень важно использовать стеммер, такой как Snowball для ex, который уменьшает ошибки из-за опечаток. Хороший список стоп-слов также очень важен, если вы хотите быть уверенным в том, чтобы избавиться от некоторых кластеров, которые не имели бы смысла из-за большого числа распространенных слов без значимого значения. Когда вы строите свою матрицу подсчета, нормализация также важна, она позволяет добавить вес к слову с низкой частотой в наборе данных, но высокой частотой в определенных выборках. Эти слова имеют смысл, и вы не хотите пропустить их. Это также снижает вес слов с высокой встречаемостью во всех конкретных выборках (близко к стоп-слову, но для слов, которые могут иметь небольшое значение). Последнее, что я заметил, было важно - это не печатать 10 лучших слов ваших кластеров, а более расширенный выбор. Обычно качество и релевантность ключевых слов по отношению к метке, которую вы бы дали кластеру, имеют тенденцию резко снижаться после этих 10–20 лучших слов. Таким образом, расширенный обзор ключевых слов поможет вам проанализировать, действительно ли ваш кластер действительно релевантен или сильно загрязнен шумом.

Винсент Тейссье
источник
2

Мой любимый метод - LDA ; Вы можете посмотреть здесь учебник с использованием пакетов Python.

Вы также можете посмотреть на такие более простые методы, как этот .

omerbp
источник