テキストマイニング:人工知能でテキスト(ニュース記事など)をクラスター化する方法は?


15

Pongのプレイ、手書きの数字の分類など、さまざまなタスクのために、いくつかのニューラルネットワーク(MLP(完全接続)、Elman(繰り返し))を構築しました...

さらに、複数桁の手書きノートを分類するなど、いくつかの最初の畳み込みニューラルネットワークを構築しようとしましたが、25x25サイズの画像などの標準化された入力に依存できる画像認識/クラスタリングタスクなど、テキストを分析およびクラスター化することはまったく新しいです。 RGBまたはグレースケールなど...前提条件の機能がたくさんあります。

テキストマイニング、たとえばニュース記事の場合、入力のサイズは常に変化しています(異なる単語、異なる文、異なるテキスト長など)。

人工知能、できればニューラルネットワーク/ SOMを利用した最新のテキストマイニングツールをどのように実装できますか?

残念ながら、簡単なチュートリアルを最初から見つけることができませんでした。複雑な科学論文は読みにくく、トピックを学ぶための最良の選択肢ではありません(私の意見では)。MLP、ドロップアウトテクニック、畳み込みニューラルネットワークなどに関するかなりの論文をすでに読んでいますが、テキストマイニングに関する基本的なものを見つけることができませんでした-私が見つけたのは、非常に限られたテキストマイニングスキルにはあま​​りにも高レベルでした。

回答:


12

Latent Dirichlet Allocation(LDA)は素晴らしいですが、ニューラルネットワークを使用したより良いものが必要な場合は、doc2vec(https://radimrehurek.com/gensim/models/doc2vec.html)を強くお勧めします

それは何ですか?Googleのword2vecと同様に機能しますが、単一の単語の特徴ベクトルではなく、段落の特徴ベクトルを取得します。この方法は、スキップグラムモデルとニューラルネットワークに基づいており、ドキュメントの特徴ベクトルを抽出するための最良の方法の1つと考えられています。

このベクターがあれば、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

2
NLPの文献では、LDAが潜在ディリクレ分析を指しているようです。この文献では、線形判別分析は役に立ちませんか?
2015年

まさに、私たちのケースでは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_

たとえば、LSAを使用した20のニュースグループから抽出されたトピックは次のとおりです。

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)

どのようにして各クラスターのトップワードを得ましたか?
マユックナイール

3

LSA + KMeansはうまく機能しますが、期待するクラスターの量を入力する必要があります。さらに、見つかったクラスターのシルエット係数は通常低いです。

より良い結果を得る別の方法は、ここで DBSCANのを使用することです。高密度の中心を検索し、拡張してクラスターを作成します。この方法では、最適な量のクラスターが自動的に検出されます。

また、Snowball for exなどのステマーを使用することが非常に重要であることがわかりました。これにより、タイプミスによるエラーが減少します。有意な意味のない一般的な単語の出現頻度が高いために意味のないクラスターを確実に削除する場合は、適切なストップワードリストも非常に重要です。カウントマトリックスを作成する場合、正規化も重要です。これにより、データセットでの出現率は低いが特定のサンプルでの出現率が高い単語に重みを追加できます。これらの言葉は意味があり、見逃したくありません。また、特定のすべてのサンプルで出現頻度の高い単語の重みを下げます(ストップワードに近いが、少し意味のある単語の場合)。最後に重要なことに気づいたのは、クラスターの上位10ワードを印刷するのではなく、選択範囲を広げることです。通常、クラスターに与えるラベルに対するキーワードの品質と関連性は、これらの上位10〜20ワードの後に​​劇的に低下する傾向があります。したがって、上位キーワードの拡張ビューは、クラスターがノイズに本当に関連しているか、非常に汚染されているかを分析するのに役立ちます。


2

私のお気に入りの方法はLDAです。あなたが見ることができ、ここでのpythonパッケージを使用してチュートリアル。

また、このようなはるかに単純なメソッドを見ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.