見出し画像

ログ分析のために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の運営にも貢献できるのでよろしくお願います。