回答編集履歴

3

d

2018/10/30 09:36

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -132,9 +132,9 @@
132
132
 
133
133
  姓名がどちらかわからないということであれば、次に2パターンを試せば、全パターン試したことになります。
134
134
 
135
- 列1 vs 列3 and 列2, 列4
135
+ 列1 vs 列3 and 列2 vs 列4
136
136
 
137
- 列1 vs 列4 and 列2, 列3
137
+ 列1 vs 列4 and 列2 vs 列3
138
138
 
139
139
 
140
140
 

2

d

2018/10/30 09:36

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -132,9 +132,9 @@
132
132
 
133
133
  姓名がどちらかわからないということであれば、次に2パターンを試せば、全パターン試したことになります。
134
134
 
135
- 列1 vs 列2 and 列3, 列4
135
+ 列1 vs 列3 and 列2, 列4
136
136
 
137
- 列1 vs 列3 and 列2, 列4
137
+ 列1 vs 列4 and 列2, 列3
138
138
 
139
139
 
140
140
 

1

2018/10/30 09:36

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -26,13 +26,13 @@
26
26
 
27
27
  for r in range(1, sheet.max_row + 1):
28
28
 
29
- data1.append({'first': sheet.cell(row=r, column=1).value,
29
+ data1.append({'name1': sheet.cell(row=r, column=1).value,
30
30
 
31
- 'last': sheet.cell(row=r, column=2).value})
31
+ 'name2': sheet.cell(row=r, column=2).value})
32
32
 
33
- data2.append({'first': sheet.cell(row=r, column=4).value,
33
+ data2.append({'name1': sheet.cell(row=r, column=4).value,
34
34
 
35
- 'last': sheet.cell(row=r, column=3).value})
35
+ 'name2': sheet.cell(row=r, column=3).value})
36
36
 
37
37
  print(data1)
38
38
 
@@ -48,21 +48,29 @@
48
48
 
49
49
  for j, person2 in enumerate(data2):
50
50
 
51
- # 名前の一致度
51
+ match1 = Levenshtein.jaro(person1['name1'], person2['name1'])
52
52
 
53
- first_name_match = Levenshtein.jaro(person1['first'], person2['first'])
53
+ match2 = Levenshtein.jaro(person1['name2'], person2['name2'])
54
54
 
55
- # 姓の一致度
56
-
57
- last_name_match = Levenshtein.jaro(person1['last'], person2['last'])
58
-
59
- # 姓及び名の一致度が 0.9 以上の場合、一致したと判断する。
60
-
61
- if first_name_match > 0.9 and last_name_match > 0.9:
55
+ if match1 > 0.9 and match2 > 0.9:
62
56
 
63
57
  matches.append([i, j])
64
58
 
59
+ break
60
+
61
+
62
+
63
+ match1 = Levenshtein.jaro(person1['name1'], person2['name2'])
64
+
65
+ match2 = Levenshtein.jaro(person1['name2'], person2['name1'])
66
+
65
- break # 同じ人物が同一データベースに重複していないという仮定
67
+ if match1 > 0.9 and match2 > 0.9:
68
+
69
+ matches.append([i, j])
70
+
71
+ break
72
+
73
+
66
74
 
67
75
  print(matches)
68
76
 
@@ -72,23 +80,23 @@
72
80
 
73
81
  out_sheet = wb.create_sheet('matches')
74
82
 
75
- for row, [i, j] in enumerate(matches):
83
+ for row, [i, j] in enumerate(matches, 1):
76
84
 
77
85
  # データベース1の一致した行の情報
78
86
 
79
- out_sheet.cell(row=i, column=1).value = i + 1
87
+ out_sheet.cell(row=row, column=1).value = i + 1
80
88
 
81
- out_sheet.cell(row=i, column=2).value = data1[i]['first']
89
+ out_sheet.cell(row=row, column=2).value = data1[i]['name1']
82
90
 
83
- out_sheet.cell(row=i, column=3).value = data1[i]['last']
91
+ out_sheet.cell(row=row, column=3).value = data1[i]['name2']
84
92
 
85
93
  # データベース2の一致した行の情報
86
94
 
87
- out_sheet.cell(row=i, column=4).value = j + 1
95
+ out_sheet.cell(row=row, column=4).value = j + 1
88
96
 
89
- out_sheet.cell(row=i, column=5).value = data2[j]['first']
97
+ out_sheet.cell(row=row, column=5).value = data2[j]['name1']
90
98
 
91
- out_sheet.cell(row=i, column=6).value = data2[j]['last']
99
+ out_sheet.cell(row=row, column=6).value = data2[j]['name2']
92
100
 
93
101
 
94
102
 
@@ -104,10 +112,34 @@
104
112
 
105
113
  ```
106
114
 
115
+ 1 TANAKA SHOICHI 3 SHOUICHI TANAKA
116
+
107
117
  2 YAMADA TARO 1 YAMADA TARO
118
+
119
+
108
120
 
109
121
  ```
110
122
 
111
123
 
112
124
 
113
125
  データ1の2行目「YAMADA TARO」とデータ2の1行目「YAMADA TARO」が一致したことを表している。
126
+
127
+
128
+
129
+ ## 追記
130
+
131
+
132
+
133
+ 姓名がどちらかわからないということであれば、次に2パターンを試せば、全パターン試したことになります。
134
+
135
+ 列1 vs 列2 and 列3, 列4
136
+
137
+ 列1 vs 列3 and 列2, 列4
138
+
139
+
140
+
141
+ ![イメージ説明](aa3fcaa30c596554d7c74e7eb7089979.png)
142
+
143
+
144
+
145
+ 丸の中の数字は列数