文字列を取得して数値に変換できるアルゴリズム、関数、または手法を探しています。アルゴリズムまたは関数に次のプロパティを持たせたいです。
- 同一の文字列は同じ計算値を生成します
類似の文字列は類似の値を生成します(類似は、意味が類似または構成が類似として定義できます)
可変長の文字列を処理できます
私は数年前にこれが達成できるという希望を与える記事を読みました。残念ながら、記事の出典を思い出せませんでした。
文字列を取得して数値に変換できるアルゴリズム、関数、または手法を探しています。アルゴリズムまたは関数に次のプロパティを持たせたいです。
類似の文字列は類似の値を生成します(類似は、意味が類似または構成が類似として定義できます)
可変長の文字列を処理できます
私は数年前にこれが達成できるという希望を与える記事を読みました。残念ながら、記事の出典を思い出せませんでした。
構図も似ているのはとても簡単です。他の誰かに取り組んでもらいましょう。
意味が似ているのはかなり難しいですが、楽しいです:)、ニューラルネットワークが英語の単語全体の2D「意味意味グラフ」を構築するためにどのようにトレーニングされたかについての記事を読んだことを覚えています。ウィキペディアの記事でトレーニングするだけで、「似ている」という意味になります。
同じことを行うこともできますが、それを1次元にすることで、類似した単語が互いに近くなる単一の連続した数字が得られます。
深刻ではない答え:すべてを0にマップする
プロパティ1:チェックします。プロパティ2:チェックします。プロパティ3:チェックします。
しかし、異なる文字列にも異なる値を取得させたいと思います。問題は、何が似ているのか、何が似ていないのかということです。
基本的に、ハッシュ関数を探しています。
さまざまな目的で設計されたハッシュ関数がたくさんあります。例の暗号化ハッシュは、逆方向に戻るのを非常に難しくしたり、入力への変更が出力にどのように影響するかを予測したりするため、計算にかなりの費用がかかります。したがって、彼らはあなたの条件2に違反しようと真剣に努力します。また、ほとんどの場合データを拡散しようとする単純なハッシュ関数もあります。彼らは主に、近い入力値が後で互いに近くないことを確認しようとします(ただし、予測可能であれば問題ありません)。
あなたはウィキペディアで読みたいかもしれません:
https://en.wikipedia.org/wiki/Hash_function#Finding_similar_substrings
(はい、ハッシュによる「類似のサブストリングの検索」に関するセクションがあります)
ウィキペディアには、ハッシュ関数のリストもあります。
https://en.wikipedia.org/wiki/List_of_hash_functions
あなたに関連するものがいくつかあります。たとえば、minhashを使用できます。ミンハッシュに着想を得たアプローチを次に示します。アルファベットのすべての文字のランダムなリストをいくつか定義します。この例でのみ「abcde」という文字があるとします。この例では、2つのリストのみを使用します。次に、私のリストは次のとおりです。
p1 = "abcde"
p2 = "edcba"
私のテストワードの最初の文字、p2の最初のf1(str)
文字のp1のインデックスとします。f2(str)
したがって、「bababa」という単語は0,3にマップされます。「アババブ」という言葉も。「dada」という単語は0,1になり、「ce」は2,0になります。このマップは単語の順列に対して不変であり(セットとして扱われるため)、長いテキストの場合は「0,0」に収束することに注意してください。それでも、微調整を行うことで、綿密な検査の候補を見つける可能性が非常に高くなります。
多くのポスターが言っているように、あなたはおそらくハッシュ関数を求めていると思います。ただし、ファッションの後で、同様の意味も可能です。潜在的ディリクレ割り当てや潜在的意味解析などを使用して、大量のテキストのコレクションでトレーニングされたモデルと比較して、単語を多次元空間にマッピングします(これらの事前トレーニングされたモデルは興味のある種類のテキストの代表的なサンプルにアクセスできない場合にダウンロードされます)。多次元ベクトルではなくスカラー値が必要な場合(わかりにくい、何を求めているのかわからない)、最も可能性の高いトピックの確率、次元全体の平均など、さまざまなことを試すことができます。 、最も可能性の高いトピックのインデックスなど。
ファジーハッシュ(コンテキストトリガー区分的ハッシュ)は、あなたが探しているものかもしれません。
実装: ssdeep
アルゴリズムの説明:コンテキストトリガー区分的ハッシュを使用してほぼ同一のファイルを識別する
num = 0
for (byte in getBytes(str))
num += UnsignedIntValue(byte)
これは3つのプロパティすべてを満たします(#2の場合、これは文字列のバイナリ構成で機能します)。