「ファストテキストを使用したシンプルなテキスト分類」となります
「ファストテキストを活用した簡潔なテキスト分類方法」
10分間の作業で、ラベル付きのデータセットとFasttextライブラリだけでテキスト分類モデルを作成する
はじめに
自然言語処理は現在、急速にビジネスのユースケースに適用されています。テキスト分類は、テキストデータの分類が手作業で行われることが多いため、ビジネスを変革するのに最も簡単なAI自動化の1つです。
テキスト分類は、入力テキストにラベルを割り当てることができるAIの開発を含みます。これらのAIモデルは、以前に見た例と対応するラベルに基づいて重みを調整することで、教師あり学習問題としてトレーニングできます。
Pythonでテキスト分類を行うために、fasttextを使用することができます。Fasttextは、迅速かつ簡単にテキスト分類モデルを作成することができるオープンソースで軽量なPythonライブラリです。
- 「16/10から22/10までの週のトップ重要なコンピュータビジョン論文」
- 「前例のない緊急事態下でのオンライン機械学習による流水下水の influent(流入)流量予測」
- [GPT-4V-Actと出会いましょう:GPT-4V(ision)とウェブブラウザを調和させたマルチモーダルAIアシスタント]
このデモで使用するデータセットは、こちらで入手できます。このデータセットには、コロナウイルスに関連するツイートと関連する感情が含まれています。極めてネガティブ、ネガティブ、中立、ポジティブ、極めてポジティブという5つのクラスがあります。このデータセットを使用して、fasttextを使用してツイートを分類するためのAIモデルを構築します。
注意すべき一つの点は、各ラベルの間に灰色の領域があることです。つまり、どこが「ポジティブ」と「極めてポジティブ」を分ける「線」なのでしょうか?また、「ネガティブ」と「極めてネガティブ」を分ける「線」はどこでしょうか?これらの2つのクラスの中間に当たるツイートが確かにいくつかあり、真のラベルは、ラベルがどの側にあるかに関する主観的なものかもしれません。そのため、検証の精度が100%になることはまずありません。
コードを試してみたい場合は、こちらからアクセスできます。
処理
以下は、fasttextモデルへの入力データを準備するために使用される主な前処理関数のいくつかです。これらのステップでは、元のテキストをクリーンアップしたり変更したりすることはせず、MLモデルへの入力のためにデータを正しい形式に設定することに焦点を当てます。
- process_data関数は、興味のある列(テキストと関連するラベルだけ)を選択します。ラベルには、「__label__」という接頭辞が必要なので、ラベルにこの接頭辞を追加します。
- split_data関数は、データをトレインセット、バリデーションセット、テストセットに分割します。
- 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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- ビデオオブジェクトセグメンテーションの革命:高度なオブジェクトレベルのメモリ読み取り技術による可愛い子の明らかな化身
- アデプトAIはFuyu-8Bをオープンソース化しました:人工知能エージェントのためのマルチモーダルアーキテクチャ
- 「人工知能生成コンテンツ(AIGC)におけるビデオ拡散モデルの包括的なレビュー」
- 「Amazon Personalizeと生成AIでマーケティングソリューションを向上させましょう」
- Llemmaに会ってください:現行基準を超える次世代数学オープン言語モデル
- リシ・スナック、新しいグローバルAI安全機関のビジョンを明確化
- このAI論文は、大規模な言語モデルを最適化する秘訣を明らかにします:報酬のバランスと過剰最適化の防止