tiitoiさん、先ほどの質問にご連絡いただきありがとうございます。
また少し目的が変わったので、改めてやりたいことを記載させていただきます。
〇目的
・2つのデータベース上に記載されている氏名の類似度を計算し、同一人物と思われる者を抽出したい。
〇データベース
・氏名が記載されたエクセルのデータベースが2つある。(以下では「データ1」、「データ2」と呼びます。)
・それぞれのデータベース内には氏名が記載された列が1列ずつあり、すべてアルファベットで記載されている。
・それぞれのデータベース上の氏名は重複して存在する可能性がある。
〇問題点
・アルファベットで記載された氏名の順序は両データベースとも、「姓名」の順とは限らず、「名姓」と
なっているこもあり、一定ではない。ただし、語の間には必ずスペースが含まれている。
(例:「YAMADA TARO」の場合も「TARO YAMADA」の場合もある。)
・氏名のアルファベット表記は一定ではない。
(例:「TANAKA SHOICHI」と「TANAKA SHOUICHI」のように、同一人物であるが表記の違いがある場合。)
〇やったこと
・氏名の順序が一定でなくても比較ができるよう、それぞれのデータベース上の氏名を、スペースを境に
2つの列に切り分けた。(1つの列に入っていた「YAMADA TARO」を「YAMADA」と「TARO」の2列に、「TARO YAMADA」を
「TARO」と「YAMADA」に。 それぞれのデータベースで切り分けた。)
・それぞれのデータベースから切り分けた氏名(合計4列)を以下のように「test.xlsx」の「テスト」シートにまとめている。
(A・B列はデータ1から、C・D列はデータ2から切り分けたもの。)
A列 B列 C列 D列
TANAKA SHOICHI TARO YAMADA
YAMADA TARO TAKASHI HARA
HIROBUMI ITO TANAKA SHOUICHI
MASAYOSHI MATSUKATA ODA NOBUNAGA
・以下のコードをIDLEで記述した。
import openpyxl
import Levenshtein
book = openpyxl.load_workbook('test.xlsx')
sheet = book.get_sheet_by_name('テスト')
for i in range(1,5):
for j in range(1,5):
A列=(sheet.cell(row=j,
column=1
).value)
B列=(sheet.cell(row=j, column=2 ).value) C列=(sheet.cell(row=i, column=3 ).value) D列=(sheet.cell(row=i, column=4 ).value) print (A列,C列,Levenshtein.jaro(A列,C列), B列,C列,Levenshtein.jaro(B列,C列), A列,D列,Levenshtein.jaro(A列,D列), B列,D列,Levenshtein.jaro(B列,D列))
・IDLE上では次のように類似度が表示された。
TANAKA TARO 0.61 SHOICHI TARO 0.46 TANAKA YAMADA 0.66 SHOICHI YAMADA 0.0
★YAMADA TARO 0.47 TARO TARO 1.0 YAMADA YAMADA 1.0 TARO YAMADA 0.47
HIROBUMI TARO 0.58 ITO TARO 0.72 HIROBUMI YAMADA 0.0 ITO YAMADA 0.0
~途中省略
MASAYOSHI TAKASHI 0.68 MATSUKATA TAKASHI 0.58 MASAYOSHI HARA 0.57 MATSUKATA HARA 0.45
★TANAKA TANAKA 1.0 SHOICHI TANAKA 0.0 TANAKA SHOUICHI 0.0 SHOICHI SHOUICHI 0.95
~以下省略
・データ2(C列D列)の氏名を上から順にデータ1の氏名(A列B列)すべてと照合させています。
・切り分けた氏名両方の類似度を算出しています。(「A列とC列」、「B列とC列」、「A列とD列」、「B列とD列」の類似度を算出。)
・「A列とC列」、「B列とC列」のいずれかの類似度が90%以上、かつ、「A列とD列」、「B列とD列」のいずれかの類似度が90%以上となったもの
(上記★印を付けた行の判定結果)を同一人物と判定し、その行だけを、新たなエクセルシートに入力したいと思っています。
イメージとしては、
氏名1 氏名3 類似度1 氏名2 氏名3 類似度2 氏名1 氏名4 類似度3 氏名2 氏名4 類似度4
YAMADA TARO 0.47 TARO TARO 1.0 YAMADA YAMADA 1.0 TARO YAMADA 0.47
TANAKA TANAKA 1.0 SHOICHI TANAKA 0.0 TANAKA SHOUICHI 0.0 SHOICHI SHOUICHI 0.95
長文で非常に分かりにくい説明になってしまいましたが、この類似度をエクセルに入力するためのコード等、お教えいただけましたら幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/30 09:14
2018/10/30 09:35
2018/10/30 14:38