sprintf() 関数の出力を逆にするアルゴリズムを探しています
-
08-06-2019 - |
質問
ログファイルの解析が必要なプロジェクトに取り組んでいます。次のようなグループメッセージを受け取る高速アルゴリズムを探しています。
P1 の気温は 35F です。
P1 の気温は 40F です。
P3 の気温は 35F です。
ロガーが停止しました。
ロガーが開始されました。
P1 の気温は 40F です。
そして、 printf() の形式で何かを出力します。
"The temperature at P%d is %dF.", Int1, Int2"
{(1,35), (1, 40), (3, 35), (1,40)}
アルゴリズムは、メッセージ グループ内のほぼすべてのデータ ロードを認識できるほど汎用的である必要があります。
この種のテクノロジーについて検索しようとしましたが、検索するための適切な用語もわかりません。
解決
概要:
あ ナイーブ!! アルゴリズムは列ごとに単語の頻度を追跡します。この場合、各行は区切り文字で列に分割できると想定できます。
入力例:
犬は月を飛び越えた
猫は月を飛び越えた
月が月を飛び越えた
車は月を飛び越えた
周波数:
Column 1: {The: 4}
Column 2: {car: 1, cat: 1, dog: 1, moon: 1}
Column 3: {jumped: 4}
Column 4: {over: 4}
Column 5: {the: 4}
Column 6: {moon: 4}
フィールドの総数に基づいてグループ化することで、これらの頻度リストをさらに分割することもできますが、この単純で便利な例では、固定数のフィールド (6) のみを使用しています。
次のステップでは、これらの頻度リストを生成した行を反復処理するので、最初の例を見てみましょう。
- の:いくつかの hand-wavy 基準を満たしており、アルゴリズムは静的である必要があると判断します。
- 犬:頻度リストの残りの部分に基づいて静的であるようには見えないため、静的なテキストではなく動的である必要があります。いくつかの事前定義された正規表現をループして、次のことを考え出します。
/[a-z]+/i
. - 以上:#1 と同じ取引です。静的なので、そのままにしておきます。
- の:#1 と同じ取引です。静的なので、そのままにしておきます。
- 月:#1 と同じ取引です。静的なので、そのままにしておきます。
したがって、最初の行を確認するだけで、次の正規表現をまとめることができます。
/The ([a-z]+?) jumps over the moon/
考慮事項:
明らかに、頻度リストがデータ全体の十分なサンプリングであると確信している限り、最初のパスで文書の一部または全体をスキャンすることを選択できます。
誤検知が結果に忍び込む可能性があり、静的フィールドと動的フィールドの間で最適なしきい値を提供するフィルタリング アルゴリズム (手動)、または人間による後処理に依存します。
全体的なアイデアはおそらく良いものですが、実際の実装では、このアルゴリズムの速度と効率が確実に考慮されることになります。
他のヒント
fscanf() と sscanf() を見落としている可能性があります。fprintf() と sprintf() の逆です。
素晴らしい提案をありがとうございました。クリス、そうです。あらゆる種類のテキストを正規化するための一般的なソリューションを探しています。この問題の解決策は、要約すると、2 つ以上の類似した文字列からパターンを動的に見つけることになります。前の 2 つに基づいて、セット内の次の要素を予測するのとほぼ同じです。
1:エベレストは高さ30000フィートです
2:K2は高さ28000フィートです
=> パターンは何ですか?=> 答え:
[名前]は[番号]フィートの高さです
現在、テキスト ファイルには数百万の行と数千のパターンを含めることができます。ファイルを非常に高速に解析し、パターンを見つけて、各パターンに関連付けられたデータセットを収集したいと考えています。
私は、メッセージ文字列のパターンを表すために、いくつかの高レベルのセマンティック ハッシュを作成することを考えました。私はトークナイザーを使用して、各トークン タイプに特定の「重み」を与えます。次に、ハッシュをグループ化し、その類似性を評価します。グループ化が完了したら、データセットを収集します。
私は、車輪を再発明する必要がなく、すでに存在しているものを再利用できることを期待していました。
クラウス
何をしようとしているかによって異なりますが、sprintf() 入力を迅速に生成することが目的の場合、これは機能します。データを解析しようとしている場合は、正規表現も使用できるかもしれません。
単純に任意の入力を受け取り、そこから必要なデータを推測し、必要な出力を生成できるツールは見つからないでしょう。それは私には強力なAIのように聞こえます。
このようなものを作成するのは、たとえ数字を認識するだけでも非常に困難です。たとえば、「123.456」は 1 つの数字ですか、それとも 2 つの数字ですか?この「123,456」はどうでしょうか?「35F」は 10 進数と「F」ですか、それとも 16 進数の値 0x35F ですか?必要な方法で解析するものを構築する必要があります。これは正規表現を使用して行うことも、次のように行うこともできます。 sscanf
, 、または他の方法で行うこともできますが、カスタムなものを記述する必要があります。
ただし、基本的な正規表現を使用すれば、これを自分で行うことができます。それは魔法ではありませんが、それほど難しい作業ではありません。次のようなものは、関心のある行を解析して統合します (Perl)。
my @vals = ();
while (defined(my $line = <>))
{
if ($line =~ /The temperature at P(\d*) is (\d*)F./)
{
push(@vals, "($1,$2)");
}
}
print "The temperature at P%d is %dF. {";
for (my $i = 0; $i < @vals; $i++)
{
print $vals[$i];
if ($i < @vals - 1)
{
print ",";
}
}
print "}\n";
ここからの出力はLです
The temperature at P%d is %dF. {(1,35),(1,40),(3,35),(1,40)}
解析する必要がある行の種類ごとに同様のことを行うことができます。これらの正規表現をそれぞれカスタムコーディングする代わりに、ファイルからこれらの正規表現を読み取ることもできます。
それを行うための具体的なツールはわかりません。同様の問題を解決する必要があったときに私がやったことは、行に一致する正規表現を推測することでした。
次に、ファイルを処理して、一致しない行のみを表示しました。線が一致しない場合は、パターンが間違っているため、調整するか、別のパターンを追加する必要があることを意味します。
約 1 時間の作業の後、10,000 行以上に一致する約 20 のパターンを見つけることに成功しました。
あなたの場合、まず 1 つのパターンが次のようなものであると「推測」できます。 "The temperature at P[1-3] is [0-9]{2}F."
. 。一致した行を削除してファイルを再処理すると、「のみ」が残ります。
ロガーが停止しました。
ロガーが開始されました。
次に一致させることができるもの "Logger (.+)."
.
その後、パターンを調整し、ログ全体に一致する新しいパターンを見つけることができます。
@ジョン:この質問は、実際にログファイル内のパターンを認識し、それに適切な形式文字列とデータを自動的に「推測」するアルゴリズムに関連していると思います。の *scanf
家族だけでそれを行うことはできません。最初にパターンが認識されて初めて役に立ちます。
@デレク・パーク:まあ、たとえ強力なAIであっても、それが正しい答えを持っているとは確信できませんでした。
おそらく、圧縮のようなメカニズムを使用できるかもしれません。
- 大きくて頻繁に使用される部分文字列を検索する
- 大きくて頻繁に使用される部分文字列パターンを見つけます。(すなわち、[パターン:1] [ジャンク] [パターン:2])
検討すべきもう 1 つの項目は、行をグループ化することです。 編集距離. 。同様の行をグループ化すると、問題がグループごとに 1 つのパターンのチャンクに分割されるはずです。
実は、これをうまく書くことができれば、 全世界に知らせてください, このツールが欲しい人は多いと思います。
@アンダース
まあ、たとえ強力なAIであっても、それが正しい答えを持っているとは確信できませんでした。
十分強力な AI が実現できると考えていました。 いつもの 文脈から正しい答えを導き出します。例えば強力な AI は、この文脈での「35F」が 16 進数ではなく温度であることを認識できます。たとえ強力なAIでも答えられないケースは確かにあります。ただし、これらは人間が答えることができないケースと同じです(仮定すると) とても 強力なAI)。
もちろん、強力なAIがないので、それはあまり問題ではありません。:)
http://www.logparser.com かなり活発な IIS フォーラムに転送します。これは、Gabriele Giuseppini の「Log Parser Toolkit」の公式サイトです。私は実際にこのツールを使用したことはありませんが、Amazon マーケットプレイスでこの本の安価なコピーを購入したことがあります。現在、1 冊の価格は 16 ドルです。ページをめくるだけなら枯れ木のインターフェースに勝るものはありません。
このフォーラムをざっと見たところ、「MS Log Parser 用の新しい GUI ツール、Log Parser Lizard」についてはこれまで知りませんでした。 http://www.lizardl.com/.
もちろん、重要な問題は文法の複雑さです。この用語が一般的に使用されているようなログ パーサーを使用するには、何をスキャンしているのかを正確に知る必要があり、そのために BNF を作成できます。何年も前に、私は Aho-and-Ullman の「Dragon Book」に基づいたコースを受講しました。もちろん、CFG を持っていれば、完全に理解された LALR テクノロジーによって最適な速度が得られます。
一方で、完全に複雑さの次元が異なる AI のようなものに到達している可能性もあるようです。