web-dev-qa-db-ja.com

Pythonを使用したトピックに基づくテキストからのキーフレーズの抽出

3列の大きなデータセットがあり、列はテキスト、フレーズ、トピックです。トピックに基づいてキーフレーズ(フレーズ列)を抽出する方法を見つけたいです。キーフレーズは、テキスト値の一部またはテキスト値全体にすることができます。

import pandas as pd


text = ["great game with a lot of amazing goals from both teams",
        "goalkeepers from both teams made misteke",
        "he won all four grand slam championchips",
        "the best player from three-point line",
        "Novak Djokovic is the best player of all time",
        "amazing slam dunks from the best players",
        "he deserved yellow-card for this foul",
        "free throw points"]

phrase = ["goals", "goalkeepers", "grand slam championchips", "three-point line", "Novak Djokovic", "slam dunks", "yellow-card", "free throw points"]

topic = ["football", "football", "tennis", "basketball", "tennis", "basketball", "football", "basketball"]

df = pd.DataFrame({"text":text,
                   "phrase":phrase,
                   "topic":topic})

print(df.text)
print(df.phrase)

データセットに50000を超える行があり、フレーズの一意の値が約48000あり、3つの異なるトピックがあるため、このようなパスを見つけるのに大きな問題があります。

サッカー、バスケットボール、テニスのすべてのトピックを含むデータセットを構築することは、本当に最良の解決策ではないと思います。そのため、このために何らかのMLモデルを作成することを考えていましたが、これも2つの機能(テキストとトピック)と1つの結果(フレーズ)を持つことになりますが、結果には48000を超えるさまざまなクラスが含まれます。それは良いアプローチではありません。

感情を見つけるために、テキスト列を機能として使用し、分類モデルを適用することを考えていました。その後、予測感情を使用して主要な特徴を抽出できますが、それらを抽出する方法がわかりません。

もう1つの問題は、CountVectorizerまたはTfidfTransformerをランダムフォレスト、ディシジョンツリー、またはその他の分類アルゴリズムで使用して感情を分類しようとすると、66%の精度しか得られず、66%感情分析にTextBlobを使用している場合の精度。

何か助けは?

3
taga

短いテキストをトピックごとにグループ化しようとしているようです。何らかの方法でデータをトークン化する必要があります。検討できるさまざまなエンコーディングがあります。

単語のバッグ。語彙の各単語の頻度を数えることによって分類します。

TF-IDF:上記のことを行いますが、より多くのエントリに表示される単語の重要性を低くします

n_grams/bigrams/trigramsは、基本的に単語のバッグの方法を実行しますが、各単語の前後のコンテキストも維持します。したがって、Wordごとにエンコードが設定されますが、「great_game」、「game_with」、「great_game_with」などのトークンも設定されます。

Orthogonal Sparse Bigrams(OSB)s「great__with」のように、単語をさらに離した特徴も作成します。

これらのオプションのいずれかがデータセットに理想的である可能性があります(最後の2つがおそらく最善の策です)。これらのオプションがどれも機能しない場合は、さらにいくつかのオプションを試すことができます。


最初に、Word埋め込みを使用できます。これらは、各ホットワードエンコーディングとは異なり、本質的にワードの意味を含む各ワードのベクトル表現です。文中の単語を合計して、文の概要が含まれている新しいベクトルを取得して、それをデコードすることができます。

双方向LSTMと一緒にWord埋め込みを使用することもできます。これは最も計算量の多いオプションですが、他のオプションが機能しない場合は、このオプションを選択することをお勧めします。 biLSTMは、単語の前後の文脈を見て、その文脈で単語が何を意味するかを理解することで、文章を解釈しようとします。

お役に立てれば

0
Mike

あなたが探しているものは、NLPでは「トピックモデリング」と呼ばれていると思います。トピックモデリングにはLDAを使用してみてください。これは最も簡単な方法の1つです。また、@ Mikeが述べたように、Wordをベクターに変換するには多くのアプローチがあります。最初にcount vectorizerのような単純なアプローチを試し、次にWord-2-vectまたはgloveのようなものに徐々に移行する必要があります。

LDAをコーパスに適用するためのリンクをいくつか添付しています。 1. https://towardsdatascience.com/nlp-extracting-the-main-topics-from-your-dataset-using-lda-in-minutes-21486f5aa925 2. https: //www.machinelearningplus.com/nlp/topic-modeling-visualization-how-to-present-results-lda-models/

0
Immortal3