-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
api.py
159 lines (139 loc) · 5.19 KB
/
api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import pandas as pd
from elasticsearch import Elasticsearch
from parsing import optimize_for_search, optimize_housenum, preprocess, extract_index, extract_house
'''
Не работает без Elastic с загруженным туда ФИАС и проиндексированным на поиск родителей каждой строки
'''
es = Elasticsearch()
def verify_address(full_address):
'''
Ищет адрес в ФИАС
Вход: строка
Выход: словарь с полным адресом по ФИАС и его составляющими
'''
if full_address == '':
return []
string = optimize_for_search(full_address)
query = {
'size': 1,
"query": {
"query_string": {
"fields": ["fullname"],
"query": string,
"fuzziness": "auto",
#"use_dis_max": "true"
# "tie_breaker": 0.3
}
}
}
response = es.search(index='fias_full_text', doc_type='address', body=query)
if False: # True чтобы добавить в ответ текст запроса
dic = response["hits"]["hits"][0]["_source"]
dic['query'] = string
return dic
try:
return response["hits"]["hits"][0]["_source"]
except IndexError: # Если не найдено
return []
def verify_home(dic, aoguid, index):
'''
Ищет конкретный дом на указанной улице
'''
query = {
"size": 1,
"query": {
"bool": {
"must": [],
"should": [], ## Here goes your stuff
"must_not": []
}
}
}
cases = query['query']['bool']['should']
must = query['query']['bool']['must']
must_not = query['query']['bool']['must_not']
must.append({"match": {
"AOGUID": aoguid
}})
if dic.get('дом', False):
must.append({"match": {
"HOUSENUM": optimize_housenum(dic["дом"])
}})
if dic.get('корпус', False):
cases.append({"match": {
"BUILDNUM": optimize_housenum(dic["корпус"])
}})
else:
must_not.append({"match":
{"BUILDNUM": "*"}
})
if dic.get('строение', False):
cases.append({"match": {
"STRUCNUM": optimize_housenum(dic['строение'])
}})
else:
must_not.append({"match":
{"STRUCNUM": '*'}
})
if index:
cases.append({"match": {
"POSTALCODE": '"' + index + '"'
}})
must.append({"bool": {
}})
response = es.search(index='fias_houses', body=query)
if len(response["hits"]["hits"]) == 0:
dic.update({"комментарий": "дом не найден в ФИАС"})
return dic
else:
response = response["hits"]["hits"][0]["_source"]
if response["BUILDNUM"] == response["HOUSENUM"]:
response['Корпус/строение'] = response["BUILDNUM"]
elif len(response["BUILDNUM"]) > len(response["HOUSENUM"]):
response['Корпус/строение'] = response["BUILDNUM"]
elif len(response["BUILDNUM"]) > len(response["HOUSENUM"]):
response['Корпус/строение'] = response["BUILDNUM"]
else:
response['Корпус/строение'] = response["BUILDNUM"]
new_dic = {key.lower(): response[key] for key in ["HOUSENUM", "BUILDNUM", "STRUCNUM", "POSTALCODE", "HOUSEID"]}
new_dic.update({'house query': str(query)})
return new_dic
def standardize(string, origin=True, debug=False):
'''
Обёртка для всех методов выше. Разделяет адрес на его составляющие и ищет совпадение в ФИАС. В 90+% случаев находит.
Вход: строка с адресом
Выход: составляющие адреса
'''
dic = {}
if origin:
dic['origin'] = string
string = preprocess(string)
address, index = extract_index(string)
try:
index = index.strip()
except AttributeError:
pass
address, house = extract_house(address)
dic['index'] = index
dic['address'] = address
dic.update(verify_address(address))
if dic.get('street', False):
dic.update(verify_home(house, dic['guid'], index))
dic.update(house)
return dic
def get_addr(strings, progress=True):
'''
Обрабатывает несколько адресов подряд.
Вход: массив строк
Выход: pandas Dataframe
'''
dics = []
n = len(strings) - 1
for i, line in enumerate(strings):
if progress:
print("Working on {0} of {1}. Progress {2:03.1f}%".format(i, n, (i / n) * 100), end='\r')
dics.append(standardize(line))
return pd.DataFrame(dics)
if __name__ == "__main__":
address = standardize("142703, Московская область, Ленинский район, г.Видное, ул. Школьная, д.78")
print(address['address'] + 'д ' + address['дом'])