[[20220704122531]] 『似た並びの文字列の検索•抽出』(nanana) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『似た並びの文字列の検索•抽出』(nanana)

Excelシート上のカナ氏名で似た並びの文字列の抽出方法が分からないので、教えて下さい。

例えば、200名のカナ氏名リストの中から下記のような似たお名前の方を検索したいです。
サトウ ケンジ
イトウ ケンシ
サイトウ ケイジ

完全一致ではなく、名前のどこか一部の3文字が同じ並びであれば抽出されるというような感じなのですが、できるのでしょうか?

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 理論上で言えばできますが、面倒ですし難しいです。

 上記例だけでも>名前のどこか一部の3文字が同じ並びであれば
 とありますが、サトウ ケンジはどの3文字をとっても一緒にならないですよね?
 (苗字と名前を区別しないのであれば同じ並びの部分がありますが、その場合は"コイズミ"さんと"カネコ イズミ"さんが同じになりますがいいのですか?)
 こういった話はどこまでを抽出して、どれを抽出しないかのパターンをきちんと練っておかないとうまくいきません。
 人間ですら「似たような」という感性は人それぞれなのに、ましてや相手はExcelという道具です。
 そのあたりはどのぐらい突き詰めている状態でしょうか?
(.:*.ゆ ゅ) 2022/07/04(月) 13:16

返信ありがとうございます。
苗字と名前は区別せずで、"コイズミ"さんと"カネコ イズミ"さんを抽出したいです。

現状、リストをソートした上で目視で似た氏名の方を探しているのですが、
上記のようなコイズミ"さんと"カネコ イズミ"さん
を見つけるは難しいため、同じ3文字の並びの方を抽出できれば少しでも範囲が狭められればと思いこのような質問を致しました。

(nanana) 2022/07/04(月) 13:42


 本当にどこだろうが三文字一致していればいいということですね?
 追加質問です。
 1)1セルに苗字と名前が入力されているのか、分割されているのか。
 2)同じセルに入力されている場合、スペースは半角と全角混同である可能性があるか
 3)名前以外のワードがセルに入力されている場合があるか(コイズミ(1)など)
 4)似たような名前毎に抽出を分けたかったりしますか?
  その場合、"タナカ キョウイチロウ" "コイズミ キョウコ" "カネコ イズミ" "サトウ イズミ" "サトウ タロウ"はそれぞれどの様に抽出(分類)されればいいですか?
(.:*.ゆ ゅ) 2022/07/04(月) 13:53

 姓名間のスペースを詰めたうえで、
 辞書(dictionary object)に
 ・Key: 各文字列の3文字の連と
 ・Item: これが発言する個人連番を、カンマ区切りで連結したもの
 という情報を作成すればよいと思います。

 最後にitemに複数の人間が登録されているものを取り出せば、
 どの3文字が、どの人の間で重なっているかがわかります。

 コードは書きませんが、こうした考え方でできると思います。
(γ) 2022/07/04(月) 13:55

(.:*.ゆ ゅ)様

どこだろうが三文字一致していればいいということで間違いありません。

 1)1セルに苗字と名前が入力されているのか、分割されているのか。
1セルに苗字と名前が入力されています

 2)同じセルに入力されている場合、スペースは半角と全角混同である可能性があるか
半角スペースのみです

 3)名前以外のワードがセルに入力されている場合があるか(コイズミ(1)など)
名前以外はありません

 4)似たような名前毎に抽出を分けたかったりしますか?
名前ごとに抽出は分けなくても大丈夫です。
分けた方が抽出しやすいのでしょうか?

(nanana) 2022/07/04(月) 14:17


 >同じ3文字の並びの方

 未だに確信が持てないのですが、 

 連続3文字ですか?
 それとも、飛び飛び許容で順に3文字並びですか?

(半平太) 2022/07/04(月) 15:41


(半平太)様

連続3文字です
(nanana) 2022/07/04(月) 16:16


  反応いただけないので、コードを書いてみました。
  一応,3つの連続した文字列(3-gram)との前提です。

 【前提】 
 ・Sheet1のA列に姓名のリストがある
 ・重複して現れる3文字を、Sheet2のA列に書きだし、
 ・それが現れる姓名を、B列以降に横に書き出す。

 【使い方】
 下記のコードを標準モジュールにコピーペイストし、
 test を実行してみてください。  

 【参考コード】
 Sub test()
     Dim dic As Object
     Dim ws2 As Worksheet
     Dim k&, j&, p&
     Dim key
     Dim s$, s3$, ss$
     Dim ary

     Set dic = CreateObject("Scripting.Dictionary")
     Set ws2 = Worksheets("Sheet2")  '■結果書き込みシート (随時修正)

     With Worksheets("Sheet1")       '■データがあるシート (随時修正)
         For k = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
             s = .Cells(k, "A").Value
             s = Replace(s, " ", "")
             For j = 1 To Len(s) - 2
                 s3 = Mid(s, j, 3)
                 If dic.exists(s3) Then
                     ss = dic(s3) & "," & CStr(k)
                     dic(s3) = ss
                 Else
                     dic(s3) = CStr(k)
                 End If
             Next
         Next

         '重複したデータを結果シートに書き込み
         For Each key In dic.keys
             If InStr(dic(key), ",") > 0 Then
                 p = p + 1
                 ws2.Cells(p, "A") = key     '3文字
                 ary = Split(dic(key), ",")

                 For j = 0 To UBound(ary)
                     ws2.Cells(p, j + 2) = .Cells(CLng(ary(j)), "A") 'それを含む姓名
                 Next
             End If
         Next
     End With
 End Sub

(γ) 2022/07/04(月) 16:18


(γ)様

返信せずにすみません

教えていただいた 辞書(dictionary object)を調べながらコードを作成しておりました。
VBA初心者で時間がかかってしまいました。

申し訳ありませんでした

コードありがとうございます!
試してみます!

(nanana) 2022/07/04(月) 17:01


コード入手できればそれで終わりなんでしょうか。
結果をお知らせいただくと、閲覧者の参考になると思います。
目的が達成できたのか、別の問題が出てきたとかもろもろあるように思います。
質問者さんだけの問題解決の場ではなく、
質問掲示板は、そういうお互いの情報交換の場だと思っています。
(γ) 2022/07/06(水) 07:08

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.