From 3347fd95b47c2b6a75ac0ebfaa8da776e33396f4 Mon Sep 17 00:00:00 2001 From: Tyler Perkins Date: Fri, 24 Feb 2023 13:41:56 -0500 Subject: [PATCH] Add search --- src/api/search.py | 30 +++++++++++++++++++++++++++++- src/app.py | 2 +- src/nlp.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/nlp.py diff --git a/src/api/search.py b/src/api/search.py index 1ffb003..42bbe84 100644 --- a/src/api/search.py +++ b/src/api/search.py @@ -3,6 +3,7 @@ from flask_restx import reqparse from api.clientGetter import getClientSafely from api.get import getExactFile as getApi from flask import abort +import nlp import logging # Exported namespace @@ -24,8 +25,35 @@ class exactSearch(Resource): if query in client.getCurrentMemeList(): return { "found" : True, - "url" : "/resource/exact/" + query + "url" : "/resource/exact/" + query, + "name" : query } else: return { "found" : False } +@api.route('/close/') +@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) + } + diff --git a/src/app.py b/src/app.py index 241d34a..dda269f 100755 --- a/src/app.py +++ b/src/app.py @@ -6,7 +6,7 @@ from api import api import os import logging -logging.basicConfig(level=logging.INFO) +logging.basicConfig(level=logging.DEBUG) isDebug = True diff --git a/src/nlp.py b/src/nlp.py new file mode 100644 index 0000000..6d1bf07 --- /dev/null +++ b/src/nlp.py @@ -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