より深い意味:Pythonでのトピックモデリング
公開: 2022-03-11コンピュータとそれらに電力を供給するプロセッサは、数値を処理するように構築されています。 対照的に、電子メールやソーシャルメディアの投稿の日常の言語は、計算に適さない緩い構造を持っています。
そこで登場するのが自然言語処理(NLP)です。NLPは、計算技術(つまり人工知能)を適用して自然言語と音声を分析することにより、言語学と重複するコンピューターサイエンスの分野です。 トピックモデリングは、特定のテキストがどのトピックに関するものであるかを理解することに焦点を当てています。 トピックモデリングにより、開発者はソーシャルメディア上の最新ニュースの検出、パーソナライズされたメッセージの推奨、偽のユーザーの検出、情報フローの特性評価などの便利な機能を実装できます。
開発者は、計算に重点を置いたコンピューターをどのように誘導して、これらの高度なレベルでの人間のコミュニケーションを理解できるでしょうか。
言葉の袋
その質問に答えるには、テキストを数学的に記述できる必要があります。 トピックモデリングPythonチュートリアルを、最も簡単な方法であるbagofwordsから始めます。
このメソッドは、テキストを単語のセットとして表します。 たとえば、「 This is an example例です」という文は、それらの単語が出現する頻度を使用して、単語のセットとして説明できます。
{"an": 1, "example": 1, "is": 1, "this": 1}このメソッドが語順を無視する方法に注意してください。 これらの例を見てください:
- 「私はスターウォーズが好きですが、ハリーポッターは好きではありません。」
- 「私はハリーポッターが好きですが、スターウォーズは好きではありません。」
これらの感情は同じ言葉で表されますが、それらは反対の意味を持っています。 ただし、テキストのトピックを分析するために、これらの違いは重要ではありません。 どちらの場合も、ハリーポッターとスターウォーズの好みに関係なく、それらの好みについて話します。 そのため、語順は重要ではありません。
複数のテキストがあり、それらの違いを理解しようとする場合、各テキストを個別に考慮するコーパス全体の数学的表現が必要です。 このために、各列が単語または用語を表し、各行がテキストを表すマトリックスを使用できます。 コーパスの可能な表現は、特定のテキスト(行)で特定の単語(列)が使用される頻度を各セルで記録することで構成されます。
この例では、コーパスは2つの文(行列行)で構成されています。
["I like Harry Potter", "I like Star Wars"]このコーパス内の単語を、遭遇した順序でリストします。私は、ハリー、ポッター、スター、ウォーズのように。 これらは、マトリックス列に対応しています。
マトリックスの値は、特定の単語が各フレーズで使用された回数を表します。
[[1,1,1,1,0,0], [1,1,0,0,1,1]] マトリックスのサイズは、テキストの数に少なくとも1つのテキストに表示される異なる単語の数を掛けることによって決定されることに注意してください。 後者は通常、不必要に大きく、減らすことができます。 たとえば、マトリックスには、意味が類似しているという事実に関係なく、「play」と「played」などの共役動詞の2つの列が含まれる場合があります。
ただし、新しい概念を説明する列が欠落している可能性があります。 たとえば、「クラシック」と「音楽」にはそれぞれ個別の意味がありますが、組み合わせた場合、「クラシック音楽」には別の意味があります。
これらの問題により、良好な結果を得るにはテキストを前処理する必要があります。
前処理およびトピッククラスタリングモデル
最良の結果を得るには、複数の前処理技術を使用する必要があります。 最も頻繁に使用されるもののいくつかを次に示します。
- 小文字。 すべての単語を小文字にします。 すべての単語を小文字にします。 単語の意味は、文中の位置に関係なく変わりません。
- nグラム。 連続するn語のすべてのグループを、 n-gramと呼ばれる新しい用語と見なします。 このようにして、「ホワイトハウス」などのケースが考慮され、語彙リストに追加されます。
- ステミング。 単語の接頭辞と接尾辞を識別して、それらをルートから分離します。 このように、「play」、「played」、「player」などの単語は、「play」という単語で表されます。 ステミングは、意味を維持しながら語彙リスト内の単語数を減らすのに役立ちますが、コーパス内の各単語に適用する必要があるため、前処理が大幅に遅くなります。
- 言葉を止めなさい。 意味や有用性に欠ける単語のグループを考慮に入れないでください。 これらには冠詞や前置詞が含まれますが、特定の一般的な動詞など、特定の事例研究に役立たない単語も含まれる場合があります。
- 用語頻度-逆ドキュメント頻度(tf-idf)。 行列の各セル内の各単語の頻度を記録する代わりに、tf–idfの係数を使用します。 これは2つの数値で構成され、乗算されます。
- tf-テキスト内の特定の用語または単語の頻度、および
- idf-ドキュメントの総数をその特定の用語を含むドキュメントの数で割った対数。
tf–idfは、コーパスで単語が使用される頻度の尺度です。 単語をグループに細分化できるようにするには、各テキストに表示される単語だけでなく、1つのテキストに頻繁に表示されるが、他のテキストにはまったく表示されない単語も理解することが重要です。
次の図は、これらの前処理手法の簡単な例を示しています。ここでは、関連性のある管理しやすい単語のリストを生成するために、コーパスの元のテキストが変更されています。
次に、Pythonでこれらの手法のいくつかを適用する方法を示します。 コーパスを数学的に表現したら、教師なし機械学習アルゴリズムを適用して、議論されているトピックを特定する必要があります。 この場合、「教師なし」とは、アルゴリズムに、その出力に適用する「サイエンスフィクション」などの事前定義されたトピックラベルがないことを意味します。
コーパスをクラスター化するために、非負行列因子分解(NMF)、スパース主成分分析(スパースPCA)、潜在的ディリクレ割り当て(LDA)など、いくつかのアルゴリズムから選択できます。 LDAは、ソーシャルメディア、医学、政治学、ソフトウェアエンジニアリングで優れた成果を上げているため、科学界で広く使用されているため、ここではLDAに焦点を当てます。
LDAは、教師なしトピック分解のモデルです。LDAは、テキストに含まれる単語と、特定のトピックに属する単語の確率に基づいてテキストをグループ化します。 LDAアルゴリズムは、トピックの単語分布を出力します。 この情報を使用して、関連する可能性が最も高い単語に基づいて主要なトピックを定義できます。 主なトピックとそれに関連する単語を特定すると、各テキストに適用されるトピックを知ることができます。

5つの短い文で構成される次のコーパスを考えてみましょう(すべてニューヨークタイムズの見出しから引用)。
corpus = [ "Rafael Nadal Joins Roger Federer in Missing US Open", "Rafael Nadal Is Out of the Australian Open", "Biden Announces Virus Measures", "Biden's Virus Plans Meet Reality", "Where Biden's Virus Plan Stands"]アルゴリズムは、政治とコロナウイルスに関連する1つのトピックと、ナダルとテニスに関連する2番目のトピックを明確に識別する必要があります。
Pythonでの戦略の適用
トピックを検出するには、必要なライブラリをインポートする必要があります。 Pythonには、NLTKやScikit-learn(sklearn)など、NLPや機械学習に役立つライブラリがいくつかあります。
from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.decomposition import LatentDirichletAllocation as LDA from nltk.corpus import stopwords CountVectorizer()を使用して、CountVectorizer CountVectorizer() )を使用して各テキストの単語の頻度を示す行列を生成します。 CountVectorizerでは、 ngram_range stop_words nグラムを含める、 lowercase=Trueですべての文字を小文字に変換するなどのパラメーターを含めると、前処理が可能になることに注意してください。
count_vect = CountVectorizer(stop_words=stopwords.words('english'), lowercase=True) x_counts = count_vect.fit_transform(corpus) x_counts.todense() matrix([[0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1]], dtype=int64) コーパスの語彙を定義するには、属性.get_feature_names()を使用するだけです。
count_vect.get_feature_names() ['announces', 'australian', 'biden', 'federer', 'joins', 'measures', 'meet', 'missing', 'nadal', 'open', 'plan', 'plans', 'rafael', 'reality', 'roger', 'stands', 'virus']次に、sklearn関数を使用してtf–idf計算を実行します。
tfidf_transformer = TfidfTransformer() x_tfidf = tfidf_transformer.fit_transform(x_counts)LDA分解を実行するには、トピックの数を定義する必要があります。 この単純なケースでは、2つのトピックまたは「ディメンション」があることがわかります。 ただし、一般的な場合、これは調整が必要なハイパーパラメータであり、ランダム検索やグリッド検索などのアルゴリズムを使用して実行できます。
dimension = 2 lda = LDA(n_components = dimension) lda_array = lda.fit_transform(x_tfidf) lda_array array([[0.8516198 , 0.1483802 ], [0.82359501, 0.17640499], [0.18072751, 0.81927249], [0.1695452 , 0.8304548 ], [0.18072805, 0.81927195]])LDAは確率的手法です。 ここでは、2つのトピックのそれぞれに属する5つの見出しのそれぞれの確率を確認できます。 予想どおり、最初の2つのテキストは最初のトピックに属し、次の3つのテキストは2番目のトピックに属する可能性が高いことがわかります。
最後に、これら2つのトピックが何であるかを理解したい場合は、各トピックで最も重要な単語を確認できます。
components = [lda.components_[i] for i in range(len(lda.components_))] features = count_vect.get_feature_names() important_words = [sorted(features, key = lambda x: components[j][features.index(x)], reverse = True)[:3] for j in range(len(components))] important_words [['open', 'nadal', 'rafael'], ['virus', 'biden', 'measures']]予想通り、LDAはテニストーナメントとナダルに関連する単語を最初のトピックに正しく割り当て、バイデンとウイルスに関連する単語を2番目のトピックに正しく割り当てました。
大規模な分析と実際のユースケース
この論文では、トピックモデリングの大規模な分析を見ることができます。 私は2016年の米国大統領選挙で主要なニューストピックを調査し、ニューヨークタイムズやフォックスニュースなどのマスメディアが汚職や移民などの報道に含まれているトピックを観察しました。 本稿では、マスメディアの内容と選挙結果との相関関係や因果関係についても分析した。
トピックモデリングは、テキストの大きなコレクションに存在する隠れたトピックパターンを発見するために、学外でも広く使用されています。 たとえば、レコメンデーションシステムで使用したり、調査、フィードバックフォーム、またはソーシャルメディアで顧客/ユーザーが何について話しているかを判断したりするために使用できます。
Toptal Engineering Blogは、この記事で紹介されているコードサンプルをレビューしてくれたJuan Manuel OrtizdeZarateに感謝の意を表します。
トピックモデリングに関する推奨読書
Twitterでのトピックモデリングの改善
アルバネーゼ、フェデリコ、エステバンフォイエシュタイン。 「コミュニティプーリングによるTwitterのトピックモデリングの改善。」 (2021年12月20日):arXiv:2201.00690 [cs.IR]
Twitterの公衆衛生分析
ポール、マイケル、マークドレーゼ。 「あなたはあなたがツイートするものです:公衆衛生のためにTwitterを分析します。」 2021年8月3日。
Twitterでの政治的方向性の分類
コーエン、ラビブ、デレク・ルース。 「Twitterでの政治的方向性の分類:それは簡単ではありません!」 2021年8月3日。
リレーショナルトピックモデルを使用したカップリングのキャプチャ
Gethers、Malcolm、DenisPoshyvanyk。 「リレーショナルトピックモデルを使用して、オブジェクト指向ソフトウェアシステムのクラス間の結合をキャプチャします。」 2010年10月25日。
