インターネットのロシア語圏では、ロシア語のテキストメッセージの分析に関する教育的な実践例はほとんどありません(サンプルコードはさらに少ない)。 したがって、トレーニングのためにデータを準備する必要がないため、一緒にデータを収集し、クラスタリングの例を検討することにしました。
使用されるライブラリのほとんどはすでに
Anaconda 3ディストリビューションに含まれているため、使用することをお勧めします。 欠落しているモジュール/ライブラリは、pip install“ package name”を介して標準としてインストールできます。
次のライブラリを接続します。
import numpy as np import pandas as pd import nltk import re import os import codecs from sklearn import feature_extraction import mpld3 import matplotlib.pyplot as plt import matplotlib as mpl
分析のために、任意のデータを取得できます。 このタスクは、私の目に留まりました:
国家支出プロジェクトの検索クエリの統計 。 データを3つのグループに分割する必要がありました:民間、州、および商業組織。 私は特別なものを発明したくなかったので、この場合にクラスタリングがどのようにつながるかを確認することにしました(実際にはそうではありませんが)。 ただし、一部の一般のVKからデータをダウンロードできます。
import vk
検索クエリデータを使用して、短いテキストデータがどの程度クラスター化されていないかを示します。 以前にテキストから特殊文字と句読点を削除し、略語を置き換えました(たとえば、SPは個人の起業家です)。 テキストが判明しました。各行には1つの検索クエリがありました。
データを配列に読み込み、正規化に進みます-単語を最初の形式に縮小します。 これは、Porter Stemmer、MyStem Stemmer、PyMorphy2を使用していくつかの方法で実行できます。 警告します-MyStemはラッパーを介して動作するため、操作の速度は非常に遅くなります。 ポーターステマーについて説明しますが、他のユーザーを他のユーザーと組み合わせて使用することはありません(たとえば、PyMorphy2を経由して、ポーターステマーを実行するなど)。
titles = open('material4.csv', 'r', encoding='utf-8', errors='ignore').read().split('\n') print(str(len(titles)) + ' ') from nltk.stem.snowball import SnowballStemmer stemmer = SnowballStemmer("russian") def token_and_stem(text): tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)] filtered_tokens = [] for token in tokens: if re.search('[--]', token): filtered_tokens.append(token) stems = [stemmer.stem(t) for t in filtered_tokens] return stems def token_only(text): tokens = [word.lower() for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)] filtered_tokens = [] for token in tokens: if re.search('[--]', token): filtered_tokens.append(token) return filtered_tokens
Pymorphy2 import pymorphy2 morph = pymorphy2.MorphAnalyzer() G=[] for i in titles: h=i.split(' ')
pymystem3ライブラリを初めて使用するときに、現在のオペレーティングシステムのアナライザー実行可能ファイルが自動的にダウンロードおよびインストールされます。
from pymystem3 import Mystem m = Mystem() A = [] for i in titles:
TF-IDF重み行列を作成します。 各検索クエリをドキュメントと見なします(これは、各ツイートがドキュメントであるTwitterの投稿を分析するときに行われます)。 sklearnパッケージからtfidf_vectorizerを取得し、ntlkパッケージからストップワードを取得します(最初はnltk.download()でダウンロードする必要があります)。 パラメータは、適切なように調整できます-上限と下限からn-gramの数まで(この場合は3を取ります)。
stopwords = nltk.corpus.stopwords.words('russian')
結果のマトリックス上で、さまざまなクラスタリング手法の適用を開始します。
num_clusters = 5
受信したデータをデータフレームにグループ化し、各クラスターに分類されるリクエストの数を計算できます。
クエリの数が多いため、テーブルを見るのはあまり便利ではなく、理解のためにインタラクティブ性を高めたいと考えています。 したがって、リクエストの相対的な相対的な位置のグラフを作成します。
最初に、ベクトル間の距離を計算する必要があります。 このために、コサイン距離が使用されます。 記事では、負の値がなく、0から1の範囲になるように、1からの減算を使用することを提案しています。
from sklearn.metrics.pairwise import cosine_similarity dist = 1 - cosine_similarity(tfidf_matrix) dist.shape
グラフは2次元と3次元になり、元の距離行列はn次元になるため、次元削減アルゴリズムを使用する必要があります。 (MDS、PCA、t-SNE)から選択する多くのアルゴリズムがありますが、インクリメンタルPCAで停止しましょう。 この選択は、実用的なアプリケーションの結果として行われました-MDSとPCAを試しましたが、十分なRAM(8ギガバイト)がなく、スワップファイルが使用され始めたときに、すぐにコンピューターを再起動することができました。
インクリメンタルPCAアルゴリズムは、分解されるデータセットが大きすぎてRAMに収まらない場合に、主成分法(PCA)の代わりとして使用されます。 IPCAは、入力データサンプルの数に依存しないメモリサイズを使用して、入力の低レベルの近似値を作成します。
視覚化自体に直接進みます。
from matplotlib import rc
名前を追加して行のコメントを解除すると、次のようになります。
私が期待するようなものではありません。 mpld3を使用して、図面をインタラクティブなグラフに変換します。
グラフ内の任意のポイントにカーソルを合わせると、対応する検索クエリとともにテキストがポップアップ表示されます。 完成したhtmlファイルの例は次の場所にあります:
Mini K-Means3Dで
zoomが必要な場合は、
Plotlyサービスがあり、Python用のプラグインがあります。
結果は次のとおりです。
例そして最後のポイントは、ワード方式に従って階層的(凝集的)クラスタリングを実行して、系統樹を作成することです。
In [44]: from scipy.cluster.hierarchy import ward, dendrogram linkage_matrix = ward(dist) fig, ax = plt.subplots(figsize=(15, 20)) ax = dendrogram(linkage_matrix, orientation="right", labels=titles); plt.tick_params(\ axis= 'x', which='both', bottom='off', top='off', labelbottom='off') plt.tight_layout()
結論残念ながら、自然言語の研究の分野では多くの未解決の問題があり、すべてのデータが特定のグループにグループ化するのが簡単で簡単ではありません。 しかし、このガイドがこのトピックへの関心を高め、さらなる実験の基礎となることを願っています。
すべてのコードは、
https :
//github.com/OlegBezverhii/python-notebooks/blob/master/ClasteringRus.pyで入手できます
。