From 2bf4fac4e51245b976056aa6e290306c248c2ac9 Mon Sep 17 00:00:00 2001 From: dldks321 <80047618+dldks321@users.noreply.github.com> Date: Thu, 19 Aug 2021 16:12:08 +0900 Subject: [PATCH 01/10] feat(server-recommend1) : add recommend algorithm --- server/recommend/recommend1/recommend1.py | 131 ++++++++++++++++++++-- 1 file changed, 122 insertions(+), 9 deletions(-) diff --git a/server/recommend/recommend1/recommend1.py b/server/recommend/recommend1/recommend1.py index aebd817..21a5a49 100644 --- a/server/recommend/recommend1/recommend1.py +++ b/server/recommend/recommend1/recommend1.py @@ -1,12 +1,125 @@ -class recommend1: +#-*-coding:utf-8-*- + +import os +import sys +import urllib.request +import json +import random +import config +from googletrans import Translator + +class recommend1 : def __init__(self): - """Will be implemented later.""" - pass + self.radius = 100 + self.key = config.api_key + + def call_api(self, lat, lng): + url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?"\ + +"location="+str(lat)+","+str(lng)\ + +"&radius="+str(self.radius)\ + +"&key="+self.key + + request = urllib.request.Request(url) + response = urllib.request.urlopen(request) + + rescode = response.getcode() + + if(rescode == 200): + response_body = response.read() + return(response_body.decode('utf-8')) + else: + print("Error Code:" + rescode) + + def call_review(self, place_key) : + url = "https://maps.googleapis.com/maps/api/place/details/json?"\ + +"place_id="+place_key\ + +"&fields=name,rating,review"\ + +"&key="+self.key + + request = urllib.request.Request(url) + response = urllib.request.urlopen(request) + + rescode = response.getcode() + + if(rescode == 200): + response_body = response.read() + return(response_body.decode('utf-8')) + else: + print("Error Code:" + rescode) + + def LocalAlignment(self, String1, String2, GapPenalty) : + Match, MisMatch = 5, -2 + DP = [] + for i in range(len(String2)+1) : + DP.append([0]*(len(String1)+1)) + + for y in range(len(String2)) : + for x in range(len(String1)) : + MatchTest = 0 + + if(String1[x] == String2[y]) : + MatchTest = Match + else : + MatchTest = MisMatch + + DP[y+1][x+1] = max(DP[y][x] + MatchTest, DP[y][x+1] + GapPenalty, DP[y+1][x] + GapPenalty, 0) + + return DP + + def word_tanslate(self, word) : + translator = Translator() + result = translator.translate(word, dest="en") + return result.text + + def json2list(self, js): + return json.loads(js) + + def recommend(self, lat, lng, keyword, epsilon): + filtering_result = [] + translated_keyword = self.word_tanslate(keyword) + + places_info = [] + api_result = self.call_api(lat, lng) + places = self.json2list(api_result) + #analyze each place infomation + for place in places['results'] : + place_info = [] + + place_info.append(place['name']) + place_info.append(place['place_id']) + + try : + if(place['business_status'] != 'OPERATIONAL') : + continue + except : + continue + + place_info.append(place['geometry']['location']['lat']) + place_info.append(place['geometry']['location']['lng']) + + places_info.append(place_info) + + for x in range(len(places_info)) : + place_key = places_info[x][1] + review_result = self.call_review(place_key) + reviews = self.json2list(review_result) + alig_max = 0 + for y in range(len(reviews['result'])) : + try : + alig_score = self.LocalAlignment(reviews['result']['reviews'][y]['text'].replace(" ","").lower(),translated_keyword.replace(" ","").lower(),-epsilon) + if(max(map(max,alig_score)) > alig_max): + alig_max = max(map(max,alig_score)) + except : + break + places_info[x].insert(0,alig_max) + places_info.sort(reverse = True) - @staticmethod - def recommend(lat, lng, keyword, epsilon): - """Returns list of place recommendation using local alignment. + while(len(filtering_result) < 5) : + try : + rank_place = places_info.pop(0) + filtering_result.append([rank_place[1],rank_place[3],rank_place[4]]) + except : + break - This function will be implemented later. - """ - return([["test", 1.0, 1.0], ["test2", 2.0, 2.0]]) + return(filtering_result) + From 696f3ee94aebc470f666d98700fefceda25a8d16 Mon Sep 17 00:00:00 2001 From: dldks321 <80047618+dldks321@users.noreply.github.com> Date: Thu, 19 Aug 2021 16:18:16 +0900 Subject: [PATCH 02/10] feat(server-recommend1) : add config at gitignore --- server/.gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/.gitignore b/server/.gitignore index 5c7389e..2339e07 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -291,4 +291,7 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk +#hide_api_key +config.py + # End of https://www.toptal.com/developers/gitignore/api/windows,linux,vim,django,python,visualstudiocode From 44884b3d34cff6752cb6c41a67d95a339dd9b822 Mon Sep 17 00:00:00 2001 From: Beomsu Lee Date: Thu, 19 Aug 2021 16:47:38 +0900 Subject: [PATCH 03/10] refactor(server-recommend1) : simple code change --- server/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/.gitignore b/server/.gitignore index 2339e07..16d198d 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -291,7 +291,7 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk -#hide_api_key +#hide api key config.py # End of https://www.toptal.com/developers/gitignore/api/windows,linux,vim,django,python,visualstudiocode From 77711cea5332e9535d2ce5a7e57caa6d47428d9f Mon Sep 17 00:00:00 2001 From: Beomsu Lee Date: Sat, 28 Aug 2021 14:24:47 +0900 Subject: [PATCH 04/10] fix(server-recommend1) : change output format --- server/recommend/recommend1/recommend1.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/recommend/recommend1/recommend1.py b/server/recommend/recommend1/recommend1.py index 21a5a49..d5a7f37 100644 --- a/server/recommend/recommend1/recommend1.py +++ b/server/recommend/recommend1/recommend1.py @@ -117,9 +117,8 @@ def recommend(self, lat, lng, keyword, epsilon): while(len(filtering_result) < 5) : try : rank_place = places_info.pop(0) - filtering_result.append([rank_place[1],rank_place[3],rank_place[4]]) + filtering_result.append({"name":rank_place[1],"lat":rank_place[3],"long":rank_place[4],"filtering":1}) except : break return(filtering_result) - From 6f810296224a673a63c9be4722f5062926ff471d Mon Sep 17 00:00:00 2001 From: Beomsu Lee Date: Thu, 2 Sep 2021 18:10:25 +0900 Subject: [PATCH 05/10] feat(server-recommend1) : Changed to affect the epsilon value proportionally --- server/recommend/recommend1/recommend1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/recommend/recommend1/recommend1.py b/server/recommend/recommend1/recommend1.py index d5a7f37..9d5188b 100644 --- a/server/recommend/recommend1/recommend1.py +++ b/server/recommend/recommend1/recommend1.py @@ -48,7 +48,7 @@ def call_review(self, place_key) : print("Error Code:" + rescode) def LocalAlignment(self, String1, String2, GapPenalty) : - Match, MisMatch = 5, -2 + Match, MisMatch = 15, -5 DP = [] for i in range(len(String2)+1) : DP.append([0]*(len(String1)+1)) @@ -106,7 +106,7 @@ def recommend(self, lat, lng, keyword, epsilon): alig_max = 0 for y in range(len(reviews['result'])) : try : - alig_score = self.LocalAlignment(reviews['result']['reviews'][y]['text'].replace(" ","").lower(),translated_keyword.replace(" ","").lower(),-epsilon) + alig_score = self.LocalAlignment(reviews['result']['reviews'][y]['text'].replace(" ","").lower(),translated_keyword.replace(" ","").lower(),(epsilon-101)) if(max(map(max,alig_score)) > alig_max): alig_max = max(map(max,alig_score)) except : From b69804dcf24acc2256d3ae268cef33eda55a128c Mon Sep 17 00:00:00 2001 From: lijm1358 Date: Fri, 3 Sep 2021 11:45:38 +0900 Subject: [PATCH 06/10] fix(server-recommend1) : fix apikey to receive as os.environ Branch recommend2 gets apikey from os' environment, and docker needed to be passed those values, so fixed way of recommend1's apikey load --- server/recommend/recommend1/recommend1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/recommend/recommend1/recommend1.py b/server/recommend/recommend1/recommend1.py index 9d5188b..d9bb6fc 100644 --- a/server/recommend/recommend1/recommend1.py +++ b/server/recommend/recommend1/recommend1.py @@ -11,7 +11,7 @@ class recommend1 : def __init__(self): self.radius = 100 - self.key = config.api_key + self.key = os.environ["GOOGLE_PLACES_KEY"] def call_api(self, lat, lng): url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?"\ From 49a479cfaaa7b30fa6b23484b48adf5cae3070fb Mon Sep 17 00:00:00 2001 From: lijm1358 Date: Fri, 3 Sep 2021 11:48:54 +0900 Subject: [PATCH 07/10] fix(server-recommend1) : instantiate recommend1 --- server/recommend/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/recommend/views.py b/server/recommend/views.py index 238306e..829779d 100644 --- a/server/recommend/views.py +++ b/server/recommend/views.py @@ -15,8 +15,8 @@ class STCViewSet(viewsets.ViewSet): @classmethod def list(self, request): - # recommender1 = recommend1() - # recommender2 = recommend2() + recommender1 = recommend1() + UserID = request.query_params["User_ID"] latitude = request.query_params["lat"] longitude = request.query_params["long"] @@ -30,7 +30,7 @@ def list(self, request): "epsilon": epsilon} serializer = PlaceRequestSerializer(data=requestData) if serializer.is_valid(): - requestResult1 = recommend1.recommend( + requestResult1 = recommender1.recommend( latitude, longitude, keywords, epsilon ) requestResult2 = recommend2.recommend( From 2e5fe59c2cb02dbbfb6df121a55777f1e7f7fb6d Mon Sep 17 00:00:00 2001 From: lijm1358 Date: Fri, 3 Sep 2021 12:06:20 +0900 Subject: [PATCH 08/10] refactor(server-recommend1) : fix pycodestyle issues --- server/recommend/recommend1/recommend1.py | 91 +++++++++++++---------- 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/server/recommend/recommend1/recommend1.py b/server/recommend/recommend1/recommend1.py index d9bb6fc..41cc038 100644 --- a/server/recommend/recommend1/recommend1.py +++ b/server/recommend/recommend1/recommend1.py @@ -1,4 +1,4 @@ -#-*-coding:utf-8-*- +# -*-coding:utf-8-*- import os import sys @@ -8,16 +8,17 @@ import config from googletrans import Translator -class recommend1 : + +class recommend1: def __init__(self): self.radius = 100 self.key = os.environ["GOOGLE_PLACES_KEY"] def call_api(self, lat, lng): url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?"\ - +"location="+str(lat)+","+str(lng)\ - +"&radius="+str(self.radius)\ - +"&key="+self.key + + "location=" + str(lat) + "," + str(lng)\ + + "&radius=" + str(self.radius)\ + + "&key=" + self.key request = urllib.request.Request(url) response = urllib.request.urlopen(request) @@ -30,11 +31,11 @@ def call_api(self, lat, lng): else: print("Error Code:" + rescode) - def call_review(self, place_key) : + def call_review(self, place_key): url = "https://maps.googleapis.com/maps/api/place/details/json?"\ - +"place_id="+place_key\ - +"&fields=name,rating,review"\ - +"&key="+self.key + + "place_id=" + place_key\ + + "&fields=name,rating,review"\ + + "&key=" + self.key request = urllib.request.Request(url) response = urllib.request.urlopen(request) @@ -47,78 +48,88 @@ def call_review(self, place_key) : else: print("Error Code:" + rescode) - def LocalAlignment(self, String1, String2, GapPenalty) : + def LocalAlignment(self, String1, String2, GapPenalty): Match, MisMatch = 15, -5 DP = [] - for i in range(len(String2)+1) : + for i in range(len(String2)+1): DP.append([0]*(len(String1)+1)) - for y in range(len(String2)) : - for x in range(len(String1)) : + for y in range(len(String2)): + for x in range(len(String1)): MatchTest = 0 - - if(String1[x] == String2[y]) : + + if(String1[x] == String2[y]): MatchTest = Match - else : + else: MatchTest = MisMatch - DP[y+1][x+1] = max(DP[y][x] + MatchTest, DP[y][x+1] + GapPenalty, DP[y+1][x] + GapPenalty, 0) + DP[y+1][x+1] = max(DP[y][x] + MatchTest, + DP[y][x+1] + GapPenalty, + DP[y+1][x] + GapPenalty, 0) return DP - def word_tanslate(self, word) : + def word_tanslate(self, word): translator = Translator() result = translator.translate(word, dest="en") return result.text def json2list(self, js): return json.loads(js) - + def recommend(self, lat, lng, keyword, epsilon): filtering_result = [] translated_keyword = self.word_tanslate(keyword) - + places_info = [] api_result = self.call_api(lat, lng) places = self.json2list(api_result) - #analyze each place infomation - for place in places['results'] : + # analyze each place infomation + for place in places['results']: place_info = [] - + place_info.append(place['name']) place_info.append(place['place_id']) - try : - if(place['business_status'] != 'OPERATIONAL') : + try: + if(place['business_status'] != 'OPERATIONAL'): continue - except : + except Exception: continue - + place_info.append(place['geometry']['location']['lat']) place_info.append(place['geometry']['location']['lng']) places_info.append(place_info) - for x in range(len(places_info)) : + for x in range(len(places_info)): place_key = places_info[x][1] review_result = self.call_review(place_key) reviews = self.json2list(review_result) alig_max = 0 - for y in range(len(reviews['result'])) : - try : - alig_score = self.LocalAlignment(reviews['result']['reviews'][y]['text'].replace(" ","").lower(),translated_keyword.replace(" ","").lower(),(epsilon-101)) - if(max(map(max,alig_score)) > alig_max): - alig_max = max(map(max,alig_score)) - except : + for y in range(len(reviews['result'])): + try: + reviewtext = reviews['result']['reviews'][y]['text'] + reviewtext = reviewtext.replace(" ", "").lower() + transtext = translated_keyword.replace(" ", "").lower() + alig_score = self.LocalAlignment(reviewtext, + transtext, + (epsilon-101)) + if(max(map(max, alig_score)) > alig_max): + alig_max = max(map(max, alig_score)) + except Exception: break - places_info[x].insert(0,alig_max) - places_info.sort(reverse = True) + places_info[x].insert(0, alig_max) + places_info.sort(reverse=True) - while(len(filtering_result) < 5) : - try : + while(len(filtering_result) < 5): + try: rank_place = places_info.pop(0) - filtering_result.append({"name":rank_place[1],"lat":rank_place[3],"long":rank_place[4],"filtering":1}) - except : + filtering_result.append({"name": rank_place[1], + "lat": rank_place[3], + "long": rank_place[4], + "filtering": 1}) + except Exception: break return(filtering_result) From 4dd5a026679a467838cc78b47c8271453e376dac Mon Sep 17 00:00:00 2001 From: lijm1358 Date: Fri, 3 Sep 2021 12:12:05 +0900 Subject: [PATCH 09/10] feat(server-recommend2) : add googletrans 4.0.0.rc1 dependency to requirements.txt --- server/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/server/requirements.txt b/server/requirements.txt index 04fa524..6831c51 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -11,3 +11,4 @@ six urllib3 tensorflow-gpu typing +googletrans==4.0.0rc1 From 5b158b3c243f76da6d3bd912abbda54df9bd8876 Mon Sep 17 00:00:00 2001 From: lijm1358 Date: Fri, 3 Sep 2021 12:26:31 +0900 Subject: [PATCH 10/10] refactor(server-recommend1) : fix codacy issues --- server/recommend/recommend1/recommend1.py | 51 ++++++++++------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/server/recommend/recommend1/recommend1.py b/server/recommend/recommend1/recommend1.py index 41cc038..a748558 100644 --- a/server/recommend/recommend1/recommend1.py +++ b/server/recommend/recommend1/recommend1.py @@ -1,16 +1,14 @@ # -*-coding:utf-8-*- import os -import sys -import urllib.request +import requests import json -import random -import config from googletrans import Translator class recommend1: def __init__(self): + """Set radius and api key for google nearby search.""" self.radius = 100 self.key = os.environ["GOOGLE_PLACES_KEY"] @@ -20,16 +18,13 @@ def call_api(self, lat, lng): + "&radius=" + str(self.radius)\ + "&key=" + self.key - request = urllib.request.Request(url) - response = urllib.request.urlopen(request) + response = requests.get(url) - rescode = response.getcode() - - if(rescode == 200): - response_body = response.read() - return(response_body.decode('utf-8')) + if(response.status_code == 200): + response_body = response.text + return(response_body) else: - print("Error Code:" + rescode) + print("Error Code:" + response.status_code) def call_review(self, place_key): url = "https://maps.googleapis.com/maps/api/place/details/json?"\ @@ -37,25 +32,23 @@ def call_review(self, place_key): + "&fields=name,rating,review"\ + "&key=" + self.key - request = urllib.request.Request(url) - response = urllib.request.urlopen(request) - - rescode = response.getcode() + response = requests.get(url) - if(rescode == 200): - response_body = response.read() - return(response_body.decode('utf-8')) + if(response.status_code == 200): + response_body = response.text + return(response_body) else: - print("Error Code:" + rescode) + print("Error Code:" + response.status_code) - def LocalAlignment(self, String1, String2, GapPenalty): + @classmethod + def LocalAlignment(cls, String1, String2, GapPenalty): Match, MisMatch = 15, -5 DP = [] - for i in range(len(String2)+1): + for _ in range(len(String2)+1): DP.append([0]*(len(String1)+1)) - for y in range(len(String2)): - for x in range(len(String1)): + for y in enumerate(String2): + for x in enumerate(String1): MatchTest = 0 if(String1[x] == String2[y]): @@ -69,12 +62,14 @@ def LocalAlignment(self, String1, String2, GapPenalty): return DP - def word_tanslate(self, word): + @classmethod + def word_tanslate(cls, word): translator = Translator() result = translator.translate(word, dest="en") return result.text - def json2list(self, js): + @classmethod + def json2list(cls, js): return json.loads(js) def recommend(self, lat, lng, keyword, epsilon): @@ -94,7 +89,7 @@ def recommend(self, lat, lng, keyword, epsilon): try: if(place['business_status'] != 'OPERATIONAL'): continue - except Exception: + except KeyError: continue place_info.append(place['geometry']['location']['lat']) @@ -102,7 +97,7 @@ def recommend(self, lat, lng, keyword, epsilon): places_info.append(place_info) - for x in range(len(places_info)): + for x, _ in enumerate(places_info): place_key = places_info[x][1] review_result = self.call_review(place_key) reviews = self.json2list(review_result)