めもめも。

using Microsoft.ML;
using Microsoft.ML.Data;

public class CommentData
{
    // このカラム名は「Label」として指定
    [ColumnName("Label")]
    public bool IsSpam { get; set; }

    public string Comment { get; set; }
}

public class CommentPrediction
{
    [ColumnName("PredictedLabel")]
    public bool IsSpam { get; set; }
}

public class SpamFilter
{
    private static MLContext context = new MLContext();

    public static void Main(string[] args)
    {
        // MLContextの作成
        var context = new MLContext();

        // 学習データの準備
        var data = context.Data.LoadFromEnumerable(new List<CommentData>
        {
            // スパムコメント
            new CommentData { IsSpam = true, Comment = "今すぐ報酬を手に入れるチャンス!" },
            new CommentData { IsSpam = true, Comment = "無料で今すぐ登録して!" },
            new CommentData { IsSpam = true, Comment = "お金を稼ぐチャンスを見逃すな!" },
            new CommentData { IsSpam = true, Comment = "クリックして簡単に儲けよう!" },

            // 非スパムコメント
            new CommentData { IsSpam = false, Comment = "この会議は素晴らしかったです。" },
            new CommentData { IsSpam = false, Comment = "最近観た映画はとても面白かったです。" },
            new CommentData { IsSpam = false, Comment = "今日のランチはとても美味しかったです。" },
            new CommentData { IsSpam = false, Comment = "新しい本を読んでみたけど面白かった。" }
        });

        // テキストの前処理と特徴量化(フィーチャー化)
        var pipeline = context.Transforms.Text.FeaturizeText("Features", "Comment")
            .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression("Label", "Features"));

        // モデルのトレーニング
        var model = pipeline.Fit(data);

        var modelPath = @"spam_model.zip"; //お好きなパス
        context.Model.Save(model, data.Schema, modelPath);

        // 既存のモデルをロード


        var newComment = new CommentData { Comment = "あなたにだけ、報酬をあげます!" };

        ITransformer newModel = LoadModel(modelPath);

        // モデルを使って予測
        var prediction = Predict(newModel, newComment);

        Console.WriteLine($"コメント: {newComment.Comment}");
        Console.WriteLine($"スパム予測: {prediction.IsSpam}");
    }

    // モデルをロードする
    private static ITransformer LoadModel(string modelPath)
    {
        return context.Model.Load(modelPath, out var modelInputSchema);
    }

    // モデルを使って新しいデータを予測する
    private static CommentPrediction Predict(ITransformer model, CommentData newComments)
    {
        // 新しいデータをロード
        var predictionEngine = context.Model.CreatePredictionEngine<CommentData, CommentPrediction>(model);
        var predictions = predictionEngine.Predict(newComments);
        return predictions;
    }

    // 新しいデータを使ってモデルを再学習する
    private static ITransformer RetrainModel(ITransformer existingModel, List<CommentData> updatedData)
    {
        var data = context.Data.LoadFromEnumerable(updatedData);

        // パイプラインを作成(フィーチャーの生成とトレーニング)
        var pipeline = context.Transforms.Text.FeaturizeText("Features", "Comment")
            .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression("Label", "Features"));

        // モデルを再学習
        var retrainedModel = pipeline.Fit(data);
        return retrainedModel;
    }

    // 再学習したモデルを保存する
    private static void SaveModel(ITransformer model, string modelPath)
    {
        context.Model.Save(model, null, modelPath);
    }
}

複数のデータから判定したい場合は

public class CommentData
{
    // このカラム名は「Label」として指定
    [ColumnName("Label")]
    public bool IsSpam { get; set; }

    public string Comment { get; set; }

    public string DataA{ get; set; }

    public string DataB{ get; set; }

    public string DataC{ get; set; }
}

として、特徴量の定義を増やす。

var pipeline = context.Transforms.Text.FeaturizeText("CommentFeatures", "Comment")
    .Append(context.Transforms.Text.FeaturizeText("DataAFeatures", "DataA"))
    .Append(context.Transforms.Text.FeaturizeText("DataBFeatures", "DataB"))
    .Append(context.Transforms.Text.FeaturizeText("DataCFeatures", "DataC"))
    .Append(context.Transforms.Concatenate("Features", "CommentFeatures", "DataAFeatures", "DataBFeatures", "DataCFeatures"))
    .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression("Label", "Features"));
投稿日時: 2024-12-30 16:10:30
更新日時: 2025-04-06 11:01:06
C#

C#で利用可能な形態素解析は、Mecabになります。

NMeCabか MeCab.DotNetの2択になります

経緯については、以下の2つを見るとよくわかります

リポジトリ移転について 2010年からOSDNで開発し公開してきたNMeCabですが、バージョン0.10.0からは、こちらGitHubで開発し公開していきます。 NMeCab MeCab.DotNet

これは何? NOTE: 将来的に、MeCab.DotNetとNMeCabを統合する作業をしています。 詳しくはこのissueを参照して下さい。 "MeCab" は、日本語形態素解析エンジンのプロジェクトです。 "NMeCab" は、上記MeCabを、.NET Framework 2.0のマネージライブラリとして実装し直したものです。ただ、もう更新されていないようです... --> GitHubで復活しました 2010年からOSDNで開発し公開してきたNMeCabですが、バージョン0.10.0からは、こちらGitHubで開発し公開していきます。 MeCab.DotNet

NMeCabは、もともとOSDNで開発されていて、.NET Frameworkが要件となっていた
その後、 別の人が .NETでも使えるように作ったのが MeCab.DotNetになります
その後、 NMeCabが OSDNから GitHubに移行し、.NETの対応を行ったため、

結論としては、 NMeCabを使えばよいという話になります

Nugetに至っては少しややこしい状況になっています。
単純にNMeCabを検索すると、作者とは別の方の名前でヒットします。
これは、説明にもありますが"An unofficial package of NMecab. "
作成者の作ったものではなく別の方が作ったものになります
ずいぶん古いものがそのまま残っているのでこちらは見なかったことにしましょう・・・

では、どれをつかえばよいかという話ですが、GitHubのページの説明では
LibNMeCabが該当するライブラリとのこと
辞書パッケージを選択してインストールすると依存関係からLibNMeCabも入るよとのこと

辞書リソースは、Disposeして解放すればよいとのこと。

Taggerインスタンスが確保している辞書リソースへのハンドルを解放するのが、この Dispose() メソッドです。(.NETプログラミングに慣れない方は注意して下さい) もちろん、一度確保した辞書リソースを再利用したい場合には、usingステートメントを記述せず、Taggerインスタンスをスコープの広い変数に保持して使い回すこともできます。アプリケーション終了時など任意のタイミングでDisposeしてください。

using NMeCab.Specialized;
using System;

class Program
{
    static void Main(string[] args)
    {
        var sentence = "「これはサンプルテキストです。」 This is a sample text.\n";

        using(var tagger = MeCabIpaDicTagger.Create())
        {
            foreach (var node in tagger.Parse(sentence))
            {
                Console.WriteLine($"文字列:{node.Surface}\t読み:{node.Reading}\t品詞:{node.PartsOfSpeech}");
            }
        }
    }
}

出力:

文字列:「      読み:「        品詞:記号
文字列:これ    読み:コレ      品詞:名詞
文字列:は      読み:ハ        品詞:助詞
文字列:サンプル        読み:サンプル  品詞:名詞
文字列:テキスト        読み:テキスト  品詞:名詞
文字列:です    読み:デス      品詞:助動詞
文字列:。      読み:。        品詞:記号
文字列:」      読み:」        品詞:記号
文字列:       読み:         品詞:記号
文字列:This    読み:  品詞:名詞
文字列:is      読み:  品詞:名詞
文字列:a       読み:  品詞:名詞
文字列:sample  読み:  品詞:名詞
文字列:text    読み:  品詞:名詞
文字列:.       読み:  品詞:名詞
投稿日時: 2024-12-30 12:08:30
更新日時: 2024-12-30 16:11:30

最近の投稿

最近のコメント

タグ

アーカイブ

その他