[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『似た並びの文字列の検索•抽出』(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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.