AIアシスト付きログ分析ツール(TWLogAIAN)を改善する方法をAI( Google Bard)に相談してみた
今朝は5時から開発開始です。この時間帯が一番調子がよいです。
昨日、本業で150MB近くあるログに異常なものがないか調べました。errorとか特定の単語がある行を探すのはログ分析ツールの検索機能で簡単にできますが、見慣れないログがないか調べるのは苦労します。
そのことが頭に残ったまま寝たので今朝起きる時にログ分析ツールを改善しようと思いました。
実現したいことは、
大量のログの中から珍しいもの探す
です。
漠然と機械学習でできそうですが、何が使えるか見当がつきません。
どうやら、そういう場合は、機械学習のチートシートで調べるらしいです。
この図のSTRATから
サンプル数が50以上? はい
ラベル付きのデータ? いいえ
分類する項目数はわかる? いいえ
サンプルは1万以上?
4番目にいいえと答えるとtough luck(強運)に行っておしまい。
つまり、機械学習では解決できないようです。
とりあえず、4番目は1万以下と回答すると
Mean ShiftかVBGMM
になります。日本語や英語の解説を見ても、ピンときません。
GO言語で使えるパッケージを探してMean Shiftが見つかりました。
のサンプルコードをみたほうが、私にはわかりやすいです。
Mean Shiftはなんとなくわかりましたが、ログから数値データに変換する方法も調べる必要があります。
なんとなくword2vectorという言葉を思い出して
とかを見つけました。ここに書いてあった
とか読んでいるうちに、どんどんど時間がたっていきました。
いろいろ調べて、TF-IDF
に行き着きました。サンプルコードを見てなんとなく使えそうな気がしてきました。
このパッケージを使わないで作れないかAI(Google Bard)に相談してみました。
「TFIDFをGO言語で作りたい」
と聞いてみました。助手の猫なら「自分で考えろ」と言われそうですが、AIは親切に答えてくれました。
作ってくれたコードは、
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)
}
}
対象の文章が英語ならちゃんと動きそうですが、日本語だと結果は正しくないと思います。でも、処理内容は、使えそうな気がしています。
ちょっと書き直して試してみたくなってきました。
なんだか、楽しくなってきたところで時間切れです。
明日に続く
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。