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

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

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ニュース

「Azure OpenAIを使用した企業文書とのチャット」

大規模言語モデル(LLM)のようなChatGPTは、インターネット上の大量のテキストから訓練される際に、数十億のパラメータ内に...

AIニュース

スナップチャットの不具合がパニックを引き起こす:私のAIが謎のストーリーと画像を投稿します

人気のあるソーシャルメディアプラットフォームであるSnapchatは、最近、AIを搭載したチャットボット「My AI」に関する技術的...

データサイエンス

自然言語処理のタクソノミー

「異なる研究分野と最近の自然言語処理(NLP)の進展の概要」

AIニュース

「全てのOECDおよびG20加盟国において、インドがAIスキルと人材で1位にランクされました」

技術の絶え間ない進化の中で、一つのスキルが輝く存在となりました。それが人工知能(AI)です。インドはその膨大な技術労働...

AIニュース

OpenAIのCEOであるSam Altman氏:AIの力が証明されるにつれて、仕事に関するリスクが生じる

OpenAIのCEOであるSam Altmanは、特に彼の作品であるChatGPTに関するAIの潜在的な危険性について公言してきました。最近のイ...

AIニュース

スポティファイはAIを取り入れる:個人に合わせたプレイリストからオーディオ広告まで

人気のある音楽ストリーミングプラットフォームであるSpotifyは、常にユーザーエクスペリエンスを向上させる方法を探求する技...