![見出し画像](https://assets.st-note.com/production/uploads/images/106857932/rectangle_large_type_2_548c2d98004ee566f950859eef8673a1.png?width=800)
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は親切に答えてくれました。
はい、日本語で答えます。
TFIDFとは、自然言語処理などで、文書中に含まれる単語の重要度を評価する手法の一つです。TFIDFは、TF(Term Frequency、単語の出現頻度)とIDF(Inverse Document Frequency、逆文書頻度)の二つの指標から計算されます。
TFは、ある単語が文書内に出現した回数を、文書中の単語数で割ることで計算されます。IDFは、ある単語が出現した文書数を、文書全体の文書数で割り、さらにその結果に自然対数をとることで計算されます。
TFIDFは、文書の類似度を計算したり、文書の重要度を評価したりするために使用されます。
Go言語でTFIDFを計算するには、次の手順に従います。文書を単語に分割します。
各単語の出現頻度を計算します。
各単語の逆文書頻度を計算します。
各単語のTFIDF値を計算します。
次のコードは、Go言語でTFIDFを計算する例です。
作ってくれたコードは、
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)
}
}
![](https://assets.st-note.com/img/1685399780504-GsnUUoRdMs.png?width=800)
対象の文章が英語ならちゃんと動きそうですが、日本語だと結果は正しくないと思います。でも、処理内容は、使えそうな気がしています。
ちょっと書き直して試してみたくなってきました。
なんだか、楽しくなってきたところで時間切れです。
明日に続く
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。