Merge pull request 'approximate-query' (#11) from approximate-query into master

Reviewed-on: tyler/Meme-service#11
This commit is contained in:
Tyler Perkins 2023-02-24 18:44:22 +00:00
commit 3bb70938ca
5 changed files with 76 additions and 23 deletions

View File

@ -1,6 +1,6 @@
from flask_restx import Namespace, Resource, fields from flask_restx import Namespace, Resource, fields
from flask_restx import reqparse from flask_restx import reqparse
from flask import make_response from flask import make_response, abort
from api.clientGetter import getClientSafely from api.clientGetter import getClientSafely
import logging import logging
import random import random
@ -18,15 +18,11 @@ class getExactFile(Resource):
def get(self, file_name): def get(self, file_name):
client = getClientSafely() client = getClientSafely()
if client is None: if client is None:
return { abort(500, "S3 failed to start")
"message" : "Error connecting to S3"
}, 500
if file_name in client.getCurrentMemeList(): if file_name in client.getCurrentMemeList():
return make_response(client.getMeme(file_name)) return make_response(client.getMeme(file_name))
else: else:
return { abort(400, "Requested file '" + file_name + "' not found")
"message": "Requested file '" + file_name + "' not found"
}, 404
@api.route('/random') @api.route('/random')
@api.doc(description="Returns a random meme") @api.doc(description="Returns a random meme")
@ -37,9 +33,7 @@ class getRandomFile(Resource):
def get(self): def get(self):
client = getClientSafely() client = getClientSafely()
if client is None: if client is None:
return { abort(500, "S3 failed to start")
"message" : "Error connecting to S3"
}, 500
choice = random.choice(tuple(client.getCurrentMemeList())) choice = random.choice(tuple(client.getCurrentMemeList()))
return make_response(client.getMeme(choice)) return make_response(client.getMeme(choice))
@ -54,9 +48,7 @@ class getRandomFile(Resource):
def get(self): def get(self):
client = getClientSafely() client = getClientSafely()
if client is None: if client is None:
return { abort(500, "S3 failed to start")
"message" : "Error connecting to S3"
}, 500
choice = random.choice(tuple(client.getCurrentMemeList())) choice = random.choice(tuple(client.getCurrentMemeList()))
while choice in self.cache: while choice in self.cache:

View File

@ -1,6 +1,9 @@
from flask_restx import Namespace, Resource, fields from flask_restx import Namespace, Resource, fields
from flask_restx import reqparse from flask_restx import reqparse
from api.clientGetter import getClientSafely from api.clientGetter import getClientSafely
from api.get import getExactFile as getApi
from flask import abort
import nlp
import logging import logging
# Exported namespace # Exported namespace
@ -18,11 +21,39 @@ class exactSearch(Resource):
def get(self, query): def get(self, query):
client = getClientSafely() client = getClientSafely()
if client is None: if client is None:
return { abort(500, "S3 failed to start")
"message": "Error connecting to S3"
}, 500
if query in client.getCurrentMemeList(): if query in client.getCurrentMemeList():
return "nice" return {
"found" : True,
"url" : "/resource/exact/" + query,
"name" : query
}
else: else:
return "boo" return { "found" : False }
@api.route('/close/<string:query>')
@api.doc(params={
'query' : 'Search query to attempt to compare against'
},description="FInd a meme thats close using levenshtein distance")
class textualClose(Resource):
def get(self, query):
client = getClientSafely()
if client is None:
abort(500, "S3 failed to start")
foundMemes = nlp.getCloseMemes(client.getCurrentMemeList(), query)
listToReturn = []
for meme in foundMemes:
entry = {
"found" : True,
"url" : "/resource/exact/" + meme,
"name" : meme
}
listToReturn.append(entry)
return {
"results" : listToReturn,
"numberOfResults" : len(foundMemes)
}

View File

@ -1,5 +1,6 @@
from flask_restx import Namespace, Resource, fields from flask_restx import Namespace, Resource, fields
from flask_restx import reqparse from flask_restx import reqparse
from flask import abort
from api.clientGetter import getClientSafely from api.clientGetter import getClientSafely
import logging import logging
@ -12,10 +13,7 @@ class getCount(Resource):
def get(self): def get(self):
client = getClientSafely() client = getClientSafely()
if client is None: if client is None:
return { abort(500, "S3 failed to start")
"message": "Error connecting to S3"
}, 500
return { return {
"count" : len(client.getCurrentMemeList()) "count" : len(client.getCurrentMemeList())
}, 200 }, 200

View File

@ -6,7 +6,7 @@ from api import api
import os import os
import logging import logging
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.DEBUG)
isDebug = True isDebug = True

32
src/nlp.py Normal file
View File

@ -0,0 +1,32 @@
from fuzzywuzzy import fuzz, process
from api.clientGetter import getClientSafely
import logging
def getCloseMemes(allPossibleMemes: set, query: str):
if not isinstance(allPossibleMemes, set):
raise Exception("Expected set for allPossibleMemes")
if not isinstance(query, str):
raise Exception("Expected str for query")
topMeme = ''
topMemes = []
topScore = 0
for meme in allPossibleMemes:
currentScore = fuzz.partial_ratio(query, meme)
if currentScore > topScore:
topMeme = meme
topScore = currentScore
if currentScore == 100:
topMemes.append(meme)
topMeme = meme
logging.info('Top memes for given query (' + query + ")")
logging.info('topMemes: ' + str(topMemes))
logging.info('topMeme : ' + topMeme)
if len(topMemes) == 0:
topMemes.append(topMeme)
return topMemes