
お世話になっております。
少し無謀な質問かもしれませんが・・・。
dim s1 as string, s2 as string
dim v as double
s1 = "abcde"
s2 = "cd"
という条件の時、
v = aimai(s1, s2)
とすれば、vに0.4だとか0.2だとか、「s1とs2がどのくらい似ているか」を返す関数、もしくはアルゴリズムは存在するのでしょうか。
返り値の最大値は1.0(完全一致)、最小値は0(何一つ同じ文字がなかった)となるとします。
何を以て「似ている」と評価するかですが、
・何文字含まれるか
・並び順
という要素は、重要でしょうね。
s2を1文字ずつ分解し、正規表現でヒットするかという流れ
/*
初めは、.+c.+
次は、.+cd.+、それと.+c.*d.+
*/
を考えたのですが、私には一般化できそうにありません。
No.1ベストアンサー
- 回答日時:
★『あいまい評価関数』は標準ではないと思います。
・特に完全一致のときが『1.0』で不一致が『0.0』で、数箇所の文字が一致すると小数で返す関数は
自分で実装するしかないでしょう。
・アルゴリズムは、上記の仕様を元に考えれば出来そうですね。
つまり、完全一致した場合は『1.0』を返して数箇所の文字(文字列)が一致した場合は、文字列の
長さと一致した個数からパーセントを算出します。このパーセントを小数に変換して返せば良いでしょう。
・また、一致する文字(文字列)が1つもなければ『0.0』を返すようにします。
・簡単なアルゴリズムでは、文字列『s1』の中に文字列『s2』が何箇所、含まれるかカウントします。
ゼロの場合は、『s2』を文字単位に分解して文字列『s1』から何箇所、含まれるかカウントします。
文字単位でどれも含まれなければ『0.0』を返す。
・上記のアルゴリズムで含まれる文字列の個数や文字単位の個数を使って、文字列『s1』の文字数との
パーセントを算出します。算出方法は例えば、
s1=abcdefcd123(11バイト)
s2=cd(2バイト)
の場合『cd』が2箇所一致します。そこで『s2の長さ』×『2箇所一致』÷『s1の長さ』=4÷11=0.3636…
を戻り値に返せばいいでしょう。
・以上。おわり。→アルゴリズムの参考にして下さい。
ご回答、ありがとうございます。
その後いろいろと考えたのですが、私が考えている事柄については、「沖田十三」という文字列に対して、「沖田十四」より「沖田十三(ヤマト初代艦長)」の方が、高い一致度を返して欲しいみたいです。
となると、数値で返すという基本方針に、かなりの無理がありますね。
再度、基本から見直してみます。
No.2
- 回答日時:
VBの関数は数も少ないのでVBの本や解説WEBを見ればすぐ判る。
質問しなくても判る。本やWEBを見なくても、その内容の盛り沢山さから、関数としては採用されてないことは判る。自分でそれ向けのプログラムを作るよりほかない。>もしくはアルゴリズムは存在するのでしょうか。
これもプログラムを作成する人が考えることです。アルゴリズム事典でも載っているなら、あるといえるでしょう。
プログラマが採用したロジックをすべてアルゴリズムというのはおこがましいと思う。
本件はそう壮大な(データが多い、処理計算が膨大に多いので工夫がいるなど)内容ではないので、アルゴリズムというほどのすっきりした解法の問題ではないでしょう。
質問者自身で(下記で)それを語っているではないですか。
>返り値の最大値は1.0(完全一致)、最小値は0(何一つ同じ文字がなかった)となるとします。
何を以て「似ている」と評価するかですが、
・何文字含まれるか
・並び順
ーー
文字の場合は機械的にそれで(上記で)よいでしょう。しかしその記号が現実世界の事象を抽象化したものなら、有無しのほか、距離とか近縁、質量(引力の源)などの定義を持ち込む人がいるかもしれない。ですからその辺は、プログラマに聞くより、理数系の方がみるカテゴリを選んで質問しなおしては。
人もの金の世界のプログラムを扱う方が文系プログラマには多く、質問のようなことを考える必要はほぼないと思うから。
正規表現が役立つかどうかも、文字列の有無の問題で、問いかけ法の集約にしか過ぎず、それ以上の一般化のプログラムテクニックの問題には使えないと思う。
VB使いに聞くべき以上の質問だといいたい。したがってOKWAVEでは現状カテ不適当。
それと実際は何の世界のことを考えた挙句なのか、やはり明示して質問すべきでは。それを回答者がわきまえないで回答すると、回答者はやけどする。Fazzy理論でも考えているお仲間に質問したら。
それに大学や大学院で議論する問題ではないかと思うが、それらをこのカテで質問されるのもどうかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- 英語 節を列挙する例示表現について 2 2022/08/15 13:52
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- 数学 数学の質問です。 kを正の実数とする。 点Pは△ABCの内部にあり、 kAP+5BP+3CP = 0 2 2023/07/03 21:24
- 工学 電気回路の2端子対回路 (1)スイッチS1のみが開いているときの電流I1を求めよ。 (2)スイッチS 4 2023/05/29 16:40
- Visual Basic(VBA) セルS2に入力した「月」と一致したB列の右隣へセルS110の値を転記する下記マクロを実行するとエラー 2 2022/12/06 17:32
- 工学 回路の勉強をしています。添付の説明で一点理解できないため教えてください。スイッチS1を閉じて定常状態 1 2022/10/24 15:58
- 統計学 t値の計算方法 1 2022/11/29 18:37
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正しい五十音順について
-
フリーセルの難易度について
-
[ EXCEL VBA ] 図形を読み込む...
-
シードを考慮したトーナメント...
-
質の良い乱数とはなんでしょうか?
-
グループを均等に分けるには?...
-
あるプログラムのコマンドライ...
-
VBAで仕様書は書きますか?
-
65536は2の何乗なのでしょうか?
-
【JAVA】数字をひし形に出力す...
-
PICマイコンのコピー(クローン...
-
VBAの再計算が反映されない件に...
-
「Outlookが他のプログラムによ...
-
自動クエリとはどういうもので...
-
C++ で、「)」が必要 というエ...
-
Vba UserFormを前面に出す方法...
-
OS入ってる機器のソフト・アプ...
-
傾いた四角形内の範囲の条件式
-
Excelに埋め込んだVBAのプログ...
-
EXCELなどで「返す」という表現
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正しい五十音順について
-
[ EXCEL VBA ] 図形を読み込む...
-
グループを均等に分けるには?...
-
シードを考慮したトーナメント...
-
アルゴリズムとプロトコールの違い
-
期間重複チェックがわかりません
-
あいまい検索(文字列一致率)
-
C♯で電卓を作成しています。演...
-
お薦めのアルゴリズム参考書
-
ランダム関数を作りたい。
-
暗号化・復号化のアルゴリズム...
-
多変数関数の最小値を求めるプ...
-
ハッシュアルゴリズム
-
一般的な解法を用いないで魔法...
-
偏りのある乱数のアルゴリズム
-
BCDについて
-
アルゴリズムが全くわからない
-
データを圧縮したい
-
ドロネー三角形のプログラム
-
カオス解析のプログラムについて
おすすめ情報