あいまい検索の文字列一致率とは?

このQ&Aのポイント
  • あいまい検索において、文字列一致率の計算方法を知りたいです。
  • 文字列一致率は、2つの文字列がどの程度似ているかを表す値です。
  • 一致する文字の数や並び順などが評価要素となります。
回答を見る
  • ベストアンサー

あいまい検索(文字列一致率)

 お世話になっております。  少し無謀な質問かもしれませんが・・・。 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.+ */ を考えたのですが、私には一般化できそうにありません。

  • hjs01
  • お礼率75% (3/4)

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答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…  を戻り値に返せばいいでしょう。 ・以上。おわり。→アルゴリズムの参考にして下さい。

hjs01
質問者

お礼

 ご回答、ありがとうございます。  その後いろいろと考えたのですが、私が考えている事柄については、「沖田十三」という文字列に対して、「沖田十四」より「沖田十三(ヤマト初代艦長)」の方が、高い一致度を返して欲しいみたいです。  となると、数値で返すという基本方針に、かなりの無理がありますね。  再度、基本から見直してみます。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

VBの関数は数も少ないのでVBの本や解説WEBを見ればすぐ判る。質問しなくても判る。本やWEBを見なくても、その内容の盛り沢山さから、関数としては採用されてないことは判る。自分でそれ向けのプログラムを作るよりほかない。 >もしくはアルゴリズムは存在するのでしょうか。 これもプログラムを作成する人が考えることです。アルゴリズム事典でも載っているなら、あるといえるでしょう。 プログラマが採用したロジックをすべてアルゴリズムというのはおこがましいと思う。 本件はそう壮大な(データが多い、処理計算が膨大に多いので工夫がいるなど)内容ではないので、アルゴリズムというほどのすっきりした解法の問題ではないでしょう。 質問者自身で(下記で)それを語っているではないですか。 >返り値の最大値は1.0(完全一致)、最小値は0(何一つ同じ文字がなかった)となるとします。  何を以て「似ている」と評価するかですが、 ・何文字含まれるか ・並び順 ーー 文字の場合は機械的にそれで(上記で)よいでしょう。しかしその記号が現実世界の事象を抽象化したものなら、有無しのほか、距離とか近縁、質量(引力の源)などの定義を持ち込む人がいるかもしれない。ですからその辺は、プログラマに聞くより、理数系の方がみるカテゴリを選んで質問しなおしては。 人もの金の世界のプログラムを扱う方が文系プログラマには多く、質問のようなことを考える必要はほぼないと思うから。 正規表現が役立つかどうかも、文字列の有無の問題で、問いかけ法の集約にしか過ぎず、それ以上の一般化のプログラムテクニックの問題には使えないと思う。 VB使いに聞くべき以上の質問だといいたい。したがってOKWAVEでは現状カテ不適当。 それと実際は何の世界のことを考えた挙句なのか、やはり明示して質問すべきでは。それを回答者がわきまえないで回答すると、回答者はやけどする。Fazzy理論でも考えているお仲間に質問したら。 それに大学や大学院で議論する問題ではないかと思うが、それらをこのカテで質問されるのもどうかと思います。

hjs01
質問者

お礼

 ご意見、ありがとうございます。

関連するQ&A

  • ASP.NETの質問なのですが、文字列の引き算は可能でしょうか?

    ASP.NETの質問なのですが、文字列の引き算は可能でしょうか? dim a as string = "abcde" dim b as string = "cde" dim c as string c = a- b このようなコードでcの答えをabとして表示できるでしょうか? ご存知の方がいらっしゃりましたらアドバイスお願いいたします。

  • ☆文字列を抜き取る★

    テキストファイルに GetPoint = ErrMsg("おはよう",target) の行があるとします。 ダブルクオートでくくられた文字列だけを出力させたい場合 下記コードでどこが間違っているでしょうか?? 今のままだと全てのコードが出力になるんですよ。。。 アドバイスをいただけると幸いです。 Sub Main() Dim iFileNumber As Integer iFileNumber = FileSystem.FreeFile() Open "C:temp\sample.txt" For Input As #iFileNumber Dim stResult As String Dim stSerch As String Dim point As Long Do While (Not FileSystem.EOF(iFileNumber)) Dim stBuffer As String Line Input #iFileNumber, stBuffer stResult = stResult & stBuffer & vbNewLine If Instr(stResult,Chr(34)) > 0 Then If Instr(stResult,Chr(34)) > 0 Then v = stResult End If End If Loop Close #iFileNumber End Sub

  • VB6で配列を文字列に変換する方法?

    VisualBasic6を使っております。 Dim ary() As Byte Dim s as String 配列を文字列に変換したり、文字列を配列にしたいのですが どのようにすれば良いのでしょうか?

  • 正規表現を使った文字列の検索及び置換について

    正規表現の検索及び置換について質問させていただきます。 下記のような文字列があったとします。 「私は、<gaiji gaijisyurui="0001" gaijicode="F040" /><gaiji gaijisyurui="0002" gaijicode="F041" />で、 <gaiji gaijisyurui="0003" gaijicode="F042" />です。」 この文章から  <gaiji gaijisyurui="0001" gaijicode="F040" />  <gaiji gaijisyurui="0002" gaijicode="F041" />  <gaiji gaijisyurui="0003" gaijicode="F042" /> の部分を検索して、それぞれ  <外字0001F040>  <外字0002F041>  <外字0003F042> と置き換え、最終的には、  「私は、<外字0001F040><外字0002F041>で、<外字0003F042>です。」 という文字列にする関数を作成したいと思っておりますが、どのようにソースを作ればよろしいのでしょうか? アドバイスや具体的なソースコードをいただけると非常に助かります。 現在、途中までソースを作成しているのですが、文字数制限でソースの半分も入りきらなかったため大雑把に書かせていただきます。 ※※※以降の処理が分かりません。 検索結果に対して文字列置換を行っても元の文字列内の置換にはならない? Private Function GaijiChange(ByVal pNaiyo As String) As String Dim wNaiyo As String = "" ' 置換後文字列 Dim wGaijisyurui As String = "" Dim wGaijicode As String = "" Dim wChangeWord As String = "" Dim wChangeStr As String = "" Dim Work As String = "" ' 正規表現で<gaiji>タグを検索 Dim wSeikiHyogen As String wSeikiHyogen = "<gaiji gaijisyurui=\" & """" & "[0-9a-zA-Z]{4}\" & """" & " gaijicode=\" & """" & "[0-9a-zA-Z]{4}\" & """" & " />" '正規表現 Dim wRegex As New System.Text.RegularExpressions.Regex( _ wSeikiHyogen, System.Text.RegularExpressions.RegexOptions.IgnoreCase) ' 文字列にに含まれる<gaiji>タグを全て検索 Dim wMc As System.Text.RegularExpressions.MatchCollection = wRegex.Matches(pNaiyo) For Each m As System.Text.RegularExpressions.Match In wMc ' 検索結果からgaijisyuruiを取得 wGaijisyurui = ' 検索結果からgaijicodeを取得 wGaijicode = ' 置換文字列作成 wChangeWord = "<外字" & wGaijisyurui & wGaijicode & ">" ' 検索結果を置換 ' ※※※ Next Return wNaiyo End Function 以上、宜しくお願いいたします。

  • VBA での文字列編集

    すみません、VBA初心者であまり調べる時間がないので質問させて頂きます。 Dim strFileName As String Dim strChk1 As String Dim strChk2 As String strFileName には "20070703_TEST001_DATA.csv" の文字列のデータが 格納されているとします。 この strFileName を編集して strChk1 には "20070703" strChk2 には "TEST001" がセットされるようにしたいのですが。。。 どのようにプログラムを書くのが一番いいのでしょうか? よろしくお願いします。

  • VBA バイナリ―から文字列にする方法

    この度はお世話になります。 現在、バイナリ―ファイル(xxxx.bin)をVBAで読み込み、バイナリ―データを文字列化して、エクセルで解析できるようなシートを作っています。 バイナリ―ファイルの中身が31 39 32 31 ・・・・・となっていたら、31393231・・・と文字列化にしたいです。 そこで、自分でプログラムを考えてみたのですが、バイナリ―が 01 などの場合、など“1”として読み込まれて、“0”が入らず、ずれてしまいます。 Sub 電文解析プログラム() Dim Deciphering_file As Variant '読み込みファイル Dim buf As Byte '1バイト格納 Dim fLen As Long 'ファイルサイズ Dim TEMP(1) As String ' Dim S_JIS As String '文字コード(2バイト) Dim str As String '文字列データ Dim i As Long Deciphering_file = Application.GetOpenFilename("BINファイル(*.bin),*.bin") fLen = FileLen(Deciphering_file) Open Deciphering_file For Binary As #1 For i = 1 To fLen Get #1, i, buf S_JIS = Hex(buf) If buf = 0 Then S_JIS = "00" End If TEMP(0) = Mid(S_JIS, 1, 1) TEMP(1) = Mid(S_JIS, 2, 1) str = myChr & TEMP(0) & TEMP(1) Next i End Sub ホントは3行くらいで済みそうな気がするんですが、あまりプログラミングをやったことありません。なので、すみませんがご教授お願いいたします。

  • VBAでワイルドカードを使った文字列検索

    初めて投稿いたします。 環境は、WinXP Access2000 下記のVBAモジュールで、文字列検索がヒットしません。 数字の比較でヒットするのはナゼでしょうか? ちなみに、変数に導入したのは、全角半角どちらも入れてみました。 この疑問・・・どなたか解決お願いします。 Sub TEST() Dim AAA As String Dim BBB As String Dim YYY As String AAA = "0" BBB = "2" YYY = AAA & BBB Select Case YYY Case "0*" MsgBox "ココを通り過ぎないで!" Case "15" MsgBox "やったね" Case Is > 0 MsgBox "なぜかココでヒットします??" End Select End Sub

  • 文字列を特定文字で分割したい

    はじめまして。宜しくお願いします。 現在Access2002のVBAをつかってタイトルのようなことを実現したいと思っています。 Dim a As String Dim b As String という二つの変数を用意して 「C:\Documents and Settings\デスクトップ\test.csv」という文字列が与えられているとき 変数aには「test.csv」を、変数bには「C:\Documents and Settings\デスクトップ\」を 格納しようとしています。 スマートなやり方がわからず、 文字列の右から一文字ずつ比較して行き、何文字目に「¥」が出てくるかをカウントして、right関数とleft関数で分割を行っています。 このような処理を行う場合、なにか適した関数があると思い探しているのですが、 なかなか見つからず、行き詰っています。(そのような関数があるのかも分からず・・) もしもなにかお気づきの方が居られましたら、ご教授宜しくお願いします。

  • 文字列操作が分かりません

    VB2008で文字列を加えるプログラムを組んでいるのですが、下記のリストのようにダブルクォーテーションで囲まれた文字列が旨く処理出来ません。 ダブルクォーテーションをダブルクォーテーションで括るのはできないのでしょうか。 どなたかご教授下さいませ。 よろしくお願いいたします。 1. Dim data1 As String = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">" //W3Cの//で(式が必要です)エラーがでます。 演算と間違われているのでしょうか。 2. Dim data2 As String = "<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">" "<meta http-equiv=" この箇所でエラーが出ており、以下のエラー文です。 (文字定数には一文字のみを指定しなけばならない) 以上 よろしくお願い致します。

  • 文字列の分解・格納

    お世話になります。 文字列の分解についてお聞きします。 環境はVB.NET2008です。 Private Sub Main(ByVal CmdArgs() As String) Dim cmds() As String cmds = System.Environment.GetCommandLineArgs() End Sub コマンドライン引数で以下のように文字列を取得しています。 ("起動exe", "/KEY=○○○/ テーブル名=△△△") この文字列を元に、 変数Aに○○○を変数Bに△△△を代入したいのですが、どうやるのでしょうか? ご教示願います。