「ファストテキストを使用したシンプルなテキスト分類」となります

「ファストテキストを活用した簡潔なテキスト分類方法」

10分間の作業で、ラベル付きのデータセットとFasttextライブラリだけでテキスト分類モデルを作成する

はじめに

自然言語処理は現在、急速にビジネスのユースケースに適用されています。テキスト分類は、テキストデータの分類が手作業で行われることが多いため、ビジネスを変革するのに最も簡単なAI自動化の1つです。

テキスト分類は、入力テキストにラベルを割り当てることができるAIの開発を含みます。これらのAIモデルは、以前に見た例と対応するラベルに基づいて重みを調整することで、教師あり学習問題としてトレーニングできます。

Pythonでテキスト分類を行うために、fasttextを使用することができます。Fasttextは、迅速かつ簡単にテキスト分類モデルを作成することができるオープンソースで軽量なPythonライブラリです。

このデモで使用するデータセットは、こちらで入手できます。このデータセットには、コロナウイルスに関連するツイートと関連する感情が含まれています。極めてネガティブ、ネガティブ、中立、ポジティブ、極めてポジティブという5つのクラスがあります。このデータセットを使用して、fasttextを使用してツイートを分類するためのAIモデルを構築します。

注意すべき一つの点は、各ラベルの間に灰色の領域があることです。つまり、どこが「ポジティブ」と「極めてポジティブ」を分ける「線」なのでしょうか?また、「ネガティブ」と「極めてネガティブ」を分ける「線」はどこでしょうか?これらの2つのクラスの中間に当たるツイートが確かにいくつかあり、真のラベルは、ラベルがどの側にあるかに関する主観的なものかもしれません。そのため、検証の精度が100%になることはまずありません。

コードを試してみたい場合は、こちらからアクセスできます。

処理

以下は、fasttextモデルへの入力データを準備するために使用される主な前処理関数のいくつかです。これらのステップでは、元のテキストをクリーンアップしたり変更したりすることはせず、MLモデルへの入力のためにデータを正しい形式に設定することに焦点を当てます。

  1. process_data関数は、興味のある列(テキストと関連するラベルだけ)を選択します。ラベルには、「__label__」という接頭辞が必要なので、ラベルにこの接頭辞を追加します。
  2. split_data関数は、データをトレインセット、バリデーションセット、テストセットに分割します。
  3. save_data_as_txt関数は、fasttextに必要なtxtファイルを作成します。fasttextは、テキストと関連するラベルを含むtxtファイルを期待するため、この関数が作成するものです。
def process_data(df_train: pd.DataFrame, df_test: pd.DataFrame) -> Tuple[pd.DataFrame, pd.DataFrame]:    df_train = df_train[["Sentiment", "OriginalTweet"]]    df_test = df_test[["Sentiment", "OriginalTweet"]]    df_train["Sentiment"] = df_train["Sentiment"].apply(lambda x: "__label__" + "_".join(a for a in x.split()))    df_test["Sentiment"] = df_test["Sentiment"].apply(lambda x: "__label__" + "_".join(a for a in x.split()))    return df_train, df_testdef split_data(df_train: pd.DataFrame, df_test: pd.DataFrame, train_fraction: float) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]:    split_point = round(df_train.shape[0] * train_fraction)    df_train, df_val = df_train.iloc[:split_point], df_train.iloc[split_point:]    return df_train, df_val, df_testdef save_data_as_txt(df_train: pd.DataFrame, df_validation: pd.DataFrame, df_test: pd.DataFrame) -> None:    df_train.to_csv(train_filepath,index=False,sep=" ",header=None,quoting=csv.QUOTE_NONE,quotechar="",escapechar=" ",)    df_validation.to_csv(validation_filepath,index=False,sep=" ",header=None,quoting=csv.QUOTE_NONE,quotechar="",escapechar=" ",)    df_test.to_csv(test_filepath,index=False,sep=" ",header=None,quoting=csv.QUOTE_NONE,quotechar="",escapechar=" ",)

これで、いくつかのパスを設定し、上記の関数を呼び出すだけで、fasttextがモデルを作成するために必要なすべてのデータが準備されます!

df_train = pd.read_csv("/kaggle/input/covid-19-nlp-text-classification/Corona_NLP_train.csv", encoding="latin1")df_test = pd.read_csv("/kaggle/input/covid-19-nlp-text-classification/Corona_NLP_test.csv", encoding="latin1")train_filepath = "df_train.txt"validation_filepath = "df_val.txt"test_filepath = "df_test.txt"df_train, df_test = process_data(df_train=df_train, df_test=df_test)df_train, df_validation, df_test = split_data(df_train=df_train, df_test=df_test, train_fraction=0.9)save_data_as_txt(df_train=df_train, df_validation=df_validation, df_test=df_test)

フィットモデル

実際には、すべての重労働は既に終わっています。モデルをフィットさせるには、単に以下のメソッドを呼び出します

model = fasttext.train_supervised(input=str(train_filepath))

、そしてできあがり!訓練済みのモデルが手に入ります。

モデルは訓練されていますが、訓練されたモデルのパフォーマンスがどれほど良いかわかりません。すべてのラベルクラスの平均精度を返す関数を作成しましょう:

def obtain_accuracies(model):    train_results = model.test(path=train_filepath)    validation_results = model.test(path=validation_filepath)    test_results = model.test(path=test_filepath)    return train_results, validation_results, test_results

以下のコードを使ってこの関数を呼び出します

train_results, validation_results, test_results = obtain_accuracies(model=model)print(train_results, validation_results, test_results)

すると、ベースラインモデルの訓練精度が71.0%、バリデーション精度が54.1%、テスト精度が48.4%という結果が表示されます。ベースラインモデルにしては悪くありませんね!

また、紹介で述べたように、AIが「非常にネガティブ」なテキストを「ネガティブ」と分類した場合、正解率の計算時には誤りとされます。したがって、モデルが犯すエラーの多くは「±1」の誤りであり、つまり正解ラベルが隣接するラベルの1つだったということです。

ハイパーパラメータの調整

これまでまあまあの結果を示したベースラインモデルがあります。もっと良い結果を得るにはどうすればよいのでしょうか?幸い、fasttext.train_supervisedメソッドに渡すことができるいくつかのハイパーパラメータが存在し、これらのパラメータを調整してモデルのパフォーマンスを向上させることができます。

ここでバリデーションセットが役立ちます — 異なるハイパーパラメータのセットを試し、その結果のモデルをバリデーションセットで評価します。バリデーションセットで最も正確な結果を出したパラメータセットが、最終モデルに使用したいものです。

どのようなハイパーパラメータのセットを試すべきでしょうか?ハイパーパラメータを手動で設定して改善を図ることもできますが(またはOptunaなどのハイパーパラメータ調整ライブラリを使用することもできます)、私はそれには怠惰すぎるため、単純にランダムサーチを使用しようと思います。

def create_training_params(baseline: bool = False) -> Dict[str, Any]:    if baseline:        return {}    epoch = random.randint(2, 120)    wordNgrams = random.randint(1, 6)    lr = np.random.uniform(0.02, 0.5)    dim = random.randint(50, 200)    minn = random.randint(0, 5)    maxn = random.randint(0, 5)    minCount = random.randint(1, 5)    ws = random.randint(2, 10)    lrUpdateRate = random.randint(50, 200)    bucket = random.randint(200000, 20000000)    return {        "epoch": epoch,        "wordNgrams": wordNgrams,        "lr": lr,        "dim": dim,        "minn": minn,        "maxn": maxn,        "minCount": minCount,        "lrUpdateRate": lrUpdateRate,        "ws": ws,        "bucket": bucket,        "thread": 12,    }

この関数は、ランダムに選択されたパラメータのセットを返します。

ランダムなパラメータセットを試すには、単に以下のコードを実行します:

model = fasttext.train_supervised(input=str(train_filepath), **create_training_params())

より完全なハイパーパラメータ調整のパイプラインを作成するために、いくつかの追加の行を追加しましょう。以下では、サーチするイテレーション数を宣言し、current best_accuracyをベースラインモデルの精度、current best paramsを空の辞書(デフォルトのパラメータ)としてインスタンス化しています。

その後、パラメータをランダムに生成し、モデルを訓練して評価するループを実行します。新しい精度が以前の記録よりも高い場合、最高精度を上書きし、将来の参照のためにbest_paramsを保存します。

iterations = 10best_accuracy, best_params = validation_results[1], {}for it in range(iterations):    params = create_training_params()    model = fasttext.train_supervised(input=str(train_filepath), **params)    train_results, validation_results, test_results = obtain_accuracies(model=model)    if validation_results[1] > best_accuracy:        best_accuracy = validation_results[1]        best_params = params    print(f"Best accuracy so far: {best_accuracy}")print(f"Best params: {best_params}")

こうすることで、最終的な正確度は56.1%という結果を得ることができました!

結論

このデータセットを使用して他のノートブックを探ってみると、正確度が70%のNaive Bayesソリューションや正確度が88%のBERTソリューションが見つかります。明らかに、これはfasttextで得た結果よりもはるかに良いです。ただし、これらの実装ではデータセットにかなりのテキスト前処理が適用されていましたが、私たちはそれを行っていませんでした。

テキストデータがきれいでない場合、fasttext AIはテキストをラベル付けするためのパターンを見つけるためにゴミのようなデータを見るかもしれません。パフォーマンスを改善するためのさらなる手順は、データセットに前処理方法を適用することです。さらに、生のデータフレームにはモデルの入力として有用なデータ列が他にもあります(私たちはテキストとラベル列しか使用していませんでした)。この次のステップはあなたに任せます。なぜなら、この記事の目的はfasttextライブラリの一般的な概要を提供することです。

私たちは次を学びました:

  • fasttextライブラリとは何か
  • fasttextで使用するためのデータセットの前処理方法
  • データ上に基準モデルを適合させる方法
  • ベースラインの結果を改善するためにモデルのハイパーパラメータを調整する方法

最後まで読んでいただきありがとうございます!これが役に立つことを願い、テキスト分類のタスクで幸運を祈ります。

リンク:

Linkedin: https://www.linkedin.com/in/sergei-issaev/

Github: https://github.com/sergeiissaev

Kaggle: https://www.kaggle.com/sergei416

VoAGI: https://medium.com/@sergei740

Twitter: https://twitter.com/realSergAI

Voobanについてもっと詳しく知る: https://vooban.com/en

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

「このAIニュースレターは、あなたが必要とするすべてです #77」

今週のAIのニュースは、Google(ジェミニ)とミストラル(8x7B)による新しい大規模言語モデルのリリースが主でしたモデルの...

AIニュース

「OpenAIがGPT-6およびGPT-7の立ち上げ準備を進める:中国で商標申請」

人工知能(AI)の推進に対するコミットメントを示す戦略的な動きとして、OpenAIは最近、中国でGPT-6とGPT-7の商標を申請しま...

AIニュース

OpenAI GPT(ジェネラル プロダクト トランスフォーマー):自分自身で作るChatGPTを活用した対話型AI

私たちの詳細な記事でカスタムGPTについて学びましょうその中では、あなたのニーズに合わせたAIチャットボットを簡単に作成す...

機械学習

マシンラーニングのロードマップ:コミュニティの推奨事項2023

前回の記事で、このロードマップの第1部では、機械学習のための出発点と方向性について簡単に説明しました初心者が堅固な基盤...

AI研究

シャージャ大学の研究者たちは、アラビア語とその方言を自然言語処理に取り入れるための人工知能ソリューションを開発しました

アラビア語は4億2200万人以上の国民の公用語であり、世界で5番目に広く使用されています。しかし、自然言語処理ではほとんど...

AI研究

「AWS 研究者がジェミニを紹介:大規模な深層学習トレーニングにおける画期的な高速障害回復」

ライス大学とAmazon Web Servicesの研究者チームが、GEMINIと呼ばれる分散トレーニングシステムを開発しました。このシステム...