見出し画像

AIアシスト付きログ分析ツール(TWLogAIAN)を改善する方法をAI( Google Bard)に相談してみた

今朝は5時から開発開始です。この時間帯が一番調子がよいです。
昨日、本業で150MB近くあるログに異常なものがないか調べました。errorとか特定の単語がある行を探すのはログ分析ツールの検索機能で簡単にできますが、見慣れないログがないか調べるのは苦労します。
そのことが頭に残ったまま寝たので今朝起きる時にログ分析ツールを改善しようと思いました。
実現したいことは、

大量のログの中から珍しいもの探す

です。
漠然と機械学習でできそうですが、何が使えるか見当がつきません。
どうやら、そういう場合は、機械学習のチートシートで調べるらしいです。

この図のSTRATから

  1. サンプル数が50以上? はい

  2. ラベル付きのデータ? いいえ

  3. 分類する項目数はわかる? いいえ

  4. サンプルは1万以上? 

4番目にいいえと答えるとtough luck(強運)に行っておしまい。
つまり、機械学習では解決できないようです。

とりあえず、4番目は1万以下と回答すると
Mean ShiftかVBGMM
になります。日本語や英語の解説を見ても、ピンときません。
GO言語で使えるパッケージを探してMean Shiftが見つかりました。

のサンプルコードをみたほうが、私にはわかりやすいです。
Mean Shiftはなんとなくわかりましたが、ログから数値データに変換する方法も調べる必要があります。
なんとなくword2vectorという言葉を思い出して

とかを見つけました。ここに書いてあった

とか読んでいるうちに、どんどんど時間がたっていきました。
いろいろ調べて、TF-IDF

に行き着きました。サンプルコードを見てなんとなく使えそうな気がしてきました。
このパッケージを使わないで作れないかAI(Google Bard)に相談してみました。
「TFIDFをGO言語で作りたい」
と聞いてみました。助手の猫なら「自分で考えろ」と言われそうですが、AIは親切に答えてくれました。

はい、日本語で答えます。

TFIDFとは、自然言語処理などで、文書中に含まれる単語の重要度を評価する手法の一つです。TFIDFは、TF(Term Frequency、単語の出現頻度)とIDF(Inverse Document Frequency、逆文書頻度)の二つの指標から計算されます。

TFは、ある単語が文書内に出現した回数を、文書中の単語数で割ることで計算されます。IDFは、ある単語が出現した文書数を、文書全体の文書数で割り、さらにその結果に自然対数をとることで計算されます。

TFIDFは、文書の類似度を計算したり、文書の重要度を評価したりするために使用されます。

Go言語でTFIDFを計算するには、次の手順に従います。文書を単語に分割します。
各単語の出現頻度を計算します。
各単語の逆文書頻度を計算します。
各単語のTFIDF値を計算します。


次のコードは、Go言語でTFIDFを計算する例です。

Google Bard

作ってくれたコードは、

package main

import (
  "fmt"
  "strings"
)

func main() {
  // 文書を取得します。
  document := "今日はいい天気です。"

  // 文書を単語に分割します。
  words := strings.Fields(document)

  // 各単語の出現頻度を計算します。
  termFrequencies := make(map[string]int)
  for _, word := range words {
    termFrequencies[word]++
  }

  // 各単語の逆文書頻度を計算します。
  inverseDocumentFrequencies := make(map[string]float64)
  for word, termFrequency := range termFrequencies {
    inverseDocumentFrequencies[word] = float64(len(words)) / float64(termFrequency)
  }

  // 各単語のTFIDF値を計算します。
  tfidfValues := make(map[string]float64)
  for word, termFrequency := range termFrequencies {
    tfidfValues[word] = termFrequency * inverseDocumentFrequencies[word]
  }

  // TFIDF値を表示します。
  for word, tfidfValue := range tfidfValues {
    fmt.Println(word, tfidfValue)
  }
}

対象の文章が英語ならちゃんと動きそうですが、日本語だと結果は正しくないと思います。でも、処理内容は、使えそうな気がしています。
ちょっと書き直して試してみたくなってきました。
なんだか、楽しくなってきたところで時間切れです。

明日に続く

この記事が参加している募集

AIとやってみた

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。