C#, ML

めもめも。

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-05-12 06:29:12
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

Chocolatey・・・Windows向けのパッケージマネージャで、ソフトウェアをインストール、管理、アップデート、アンインストールするためのツールです。Linuxのaptやyum、macOSのbrewに似た概念

Windows Package Manager (winget)・・・Microsoftが提供するWindows向けの公式パッケージ管理ツール。wingetがmicrosoftが公式に提供しているパッケージマネージャー。

サイト

https://chocolatey.org/

Chocolateyのインストール

インストール方法は、Communityに記載あり。
https://community.chocolatey.org/

Install Chocolatey をクリック

管理者モードでPowerShellを開く

Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

以下にchoco.exeがインストールされるのね
C:\ProgramData\chocolatey\bin

> choco -v
2.4.1
# パッケージインストール すべて yes とするなら -y をつける
choco install <パッケージ名>

# パッケージのアップグレード
choco upgrade <パッケージ名>

# 全パッケージ更新
choco upgrade chocolatey

# パッケージのアンインストール
choco uninstall <パッケージ名>

# パッケージの一覧
choco list

# Chocolatey自体の更新
choco upgrade chocolatey

システムの更新やシステム全体を変更するような機能については、管理者モードで起動したシェルで操作はマスト
そうでないものだけ、ユーザー権限でいれれるが基本は管理者モードで操作をする

Github CLIをインストール
通常の権限だと、「パス 'C:\ProgramData\chocolatey.chocolatey' へのアクセスが拒否されました。」だったので、引き続き管理者権限。

choco install gh
Chocolatey v2.4.1
Installing the following packages:
gh
By installing, you accept licenses for the packages.
Downloading package from source 'https://community.chocolatey.org/api/v2/'

gh v2.63.2 [Approved]
gh package files install completed. Performing other installation steps.
The package gh wants to run 'chocolateyInstall.ps1'.
Note: If you don't run this script, the installation will fail.
Note: To confirm automatically next time, use '-y' or consider:
choco feature enable -n allowGlobalConfirmation
Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint): Y

Installing 64-bit gh...
gh has been installed.
  gh may be able to be automatically uninstalled.
Environment Vars (like PATH) have changed. Close/reopen your shell to
 see the changes (or in powershell/cmd.exe just type `refreshenv`).
 The install of gh was successful.
  Software installed as 'MSI', install location is likely default.

Chocolatey installed 1/1 packages.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

>choco list
Chocolatey v2.4.1
chocolatey 2.4.1
gh 2.63.2

Githubの認証を行う ※事前に ssh-keygen -t rsa -b 4096 -f xxxx(好きな名前) で 秘密鍵/公開鍵を作っておく

gh auth login
? Where do you use GitHub? 
> GitHub.com
  Other

? What is your preferred protocol for Git operations on this host?
  HTTPS
> SSH

// アップロードする 公開鍵を選択
? Upload your SSH public key to your GitHub account?
> C:\Users\xxxx\.ssh\xxxxxxxx.pub
  Skip

// GitHubアカウント内で表示される名前を設定
? Title for your SSH key: (GitHub CLI) xxxxxxxxx

? How would you like to authenticate GitHub CLI?
> Login with a web browser
  Paste an authentication token

// web browserを選択すると・・・以下メッセージが表示されるため Enterを押すとブラウザが立ち上がりログイン画面が表示される。
Press Enter to open https://github.com/login/device in your browser...

// ログインすると、one-timeのコードが表示されるのでそれをログイン画面後に表示されるコード入力画面に入力するとログインが完了する
! First copy your one-time code: XXXX-XXXX
✓ Authentication complete.
- gh config set -h github.com git_protocol ssh
✓ Configured git protocol
✓ Uploaded the SSH key to your GitHub account: C:\Users\xxxx\.ssh\xxxxxxxx.pub
✓ Logged in as xxxxxx
投稿日時: 2024-12-20 15:08:20
更新日時: 2025-04-11 17:53:11

最近の投稿

最近のコメント

タグ

アーカイブ

その他