ログ分析のためにTF-IDFパッケージを使う練習 その1
今朝は5時から開発開始です。
昨日、GitHUBでForkしたTF-IDFのパケージ
をログ分析のために使う練習です。
ファイルからログを読み込んで、TFIDFを計算して、最初の行との類似度を計算するテストプログラムを作ってみました。
package main
import (
"fmt"
"log"
"os"
"github.com/twsnmp/tfidf"
"github.com/twsnmp/tfidf/similarity"
"github.com/twsnmp/tfidf/util"
)
func main() {
if len(os.Args) < 2 {
return
}
lines, err := util.ReadLines(os.Args[1])
if err != nil {
log.Fatalln(err)
}
if len(lines) < 1 {
log.Fatalln("no lines")
}
f := tfidf.New()
f.AddDocs(lines...)
w1 := f.Cal(lines[0])
log.Println(w1)
for i := 1; i < len(lines); i++ {
w2 := f.Cal(lines[i])
sim := similarity.Cosine(w1, w2)
if sim > 0.5 {
log.Println(w2)
fmt.Printf("cosine between 0 and %d is %f .\n", i, sim)
}
}
}
テスト用のログファイル
Jun 3 07:13:48 minipc snmpd[23595]: Connection from UDP: [192.168.1.4]:57885->[192.168.1.210]:161
Jun 3 07:14:01 minipc CRON[10234]: (root) CMD (/usr/sbin/mon.sh)
Jun 3 07:14:01 minipc memmon: Mem: 7987020 743760 171064 465844 7072196 6467548
Jun 3 07:14:01 minipc loadmon: 07:14:01 up 209 days, 23:56, 1 user, load average: 0.99, 0.91, 0.92
Jun 3 07:14:22 minipc snmpd[23595]: Connection from UDP: [192.168.1.250]:65404->[192.168.1.210]:161
を読み込ませると
% go run main.go test2.log
2023/06/03 08:07:19 map[07:13:48:0.12206803207423439 3:0 Connection:0.07701635339554948 Jun:0 UDP::0.07701635339554948 [192.168.1.4]:57885->[192.168.1.210]:161:0.12206803207423439 from:0.07701635339554948 minipc:0 snmpd[23595]::0.07701635339554948]
2023/06/03 08:07:19 map[07:14:22:0.12206803207423439 3:0 Connection:0.07701635339554948 Jun:0 UDP::0.07701635339554948 [192.168.1.250]:65404->[192.168.1.210]:161:0.12206803207423439 from:0.07701635339554948 minipc:0 snmpd[23595]::0.07701635339554948]
cosine between 0 and 4 is 0.721626 .
最初の行と5行目のログが似ていると判断しています。
いい感じです。
試しにログから先頭のタイムスタンプを削除しt
minipc snmpd[23595]: Connection from UDP: [192.168.1.4]:57885->[192.168.1.210]:161
minipc CRON[10234]: (root) CMD (/usr/sbin/mon.sh)
minipc memmon: Mem: 7987020 743760 171064 465844 7072196 6467548
minipc loadmon: 07:14:01 up 209 days, 23:56, 1 user, load average: 0.99, 0.91, 0.92
minipc snmpd[23595]: Connection from UDP: [192.168.1.250]:65404->[192.168.1.210]:161
のようにすると
% go run main.go test3.log
2023/06/03 08:10:49 map[Connection:0.11552453009332421 UDP::0.11552453009332421 [192.168.1.4]:57885->[192.168.1.210]:161:0.18310204811135158 from:0.11552453009332421 minipc:0 snmpd[23595]::0.11552453009332421]
2023/06/03 08:10:49 map[Connection:0.11552453009332421 UDP::0.11552453009332421 [192.168.1.250]:65404->[192.168.1.210]:161:0.18310204811135158 from:0.11552453009332421 minipc:0 snmpd[23595]::0.11552453009332421]
cosine between 0 and 4 is 0.807120 .
類似度が上がります。ますますいい感じです。
でも、ログの量を増やすと、なんだかおかしくなります。
もう少し考える必要があります。
明日に続く
いいなと思ったら応援しよう!
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。
ソフトウェアのマニュアルをnoteの記事で提供しています。
サポートによりnoteの運営にも貢献できるのでよろしくお願います。