123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- import pandas as pd
- from flask_cors import CORS
- from flask import (
- Blueprint, request, jsonify
- )
- bp = Blueprint('routes', __name__,)
- df = pd.read_csv('rule.csv')
- user_input = "Improve the living and working conditions of everyone everywhere Fair and humane laws and practices"
- compare_column1 = df['summary']
- compare_column2 = df['modules']
- return_column = df['name']
- @bp.route('/request', methods=('GET', 'POST'))
- def handle_request():
- #user_input = request.args.get('question')
- #closest_value, ruleId = find_closest_match(user_input, df['summary'], df['modules'], df['name'], df['ruleID'])
-
- #finalValue = "https://communityrule.info/create/?r=" + str(ruleId)
- #response_message = f"{closest_value}"
- #response_data = {
- # 'community': response_message,
- # 'link': finalValue
- #}
- #return jsonify(response_data)
-
- user_input = request.args.get('question')
- top_matches = find_closest_match(user_input, df['summary'], df['modules'], df['name'], df['ruleID'])
-
- recommendations = []
- for similarity, name, ruleId in top_matches:
- finalValue = f"https://communityrule.info/create/?r={ruleId}"
- recommendations.append({
- 'community': name,
- 'link': finalValue,
- })
- print(jsonify(recommendations))
- return jsonify(recommendations)
- #finalValue = "https://communityrule.info/create/?r=" + str(ruleId)
- #response_message = f"{closest_value}"
- #response_data = {
- # 'community': response_message,
- # 'link': finalValue
- #}
- #return jsonify(response_data)
- def find_closest_match(user_input, compare_column1_values, compare_column2_values, return_column_values, rule_id_values):
- print(user_input)
- max_similarity_curr = -1
- closest_value = None
- rule_id = None
- user_tokens = user_input.split()
- results = []
- # Compare user input with each value in the compare columns
- for compare_value1, compare_value2, return_value, ruleId in zip(compare_column1_values, compare_column2_values, return_column_values, rule_id_values):
- # Convert compare_value2 to string if it's a float
- if isinstance(compare_value1, float):
- compare_value1 = str(compare_value1)
- if isinstance(compare_value2, float):
- compare_value2 = str(compare_value2)
- # Split compare_value2 into tokens
- compare_tokens1 = compare_value1.split()
- compare_tokens2 = compare_value2.split()
- # Calculate similarity between user input and compare_value1 and compare_value2
- similarity1 = similarity_score(user_tokens, compare_tokens1)
- similarity2 = similarity_score(user_tokens, compare_tokens2)
- # Take the maximum similarity between similarity1 and similarity2
- max_similarity_curr = max(similarity1, similarity2)
- print(similarity1, similarity2)
- # Update closest value if current similarity is greater
- #if max_similarity_curr > max_similarity:
- #max_similarity = max_similarity_curr
- #closest_value = return_value
- #rule_id = ruleId
- results.append((max_similarity_curr, return_value, ruleId))
- # print(results)
- results.sort(reverse=True, key=lambda x: x[0])
- return results[:3]
- def similarity_score(set1, set2):
- # Calculate the intersection of the two sets
- intersection = len(set(set1).intersection(set(set2)))
-
- # Calculate the union of the two sets
- union = len(set(set1).union(set(set2)))
-
- # Calculate the Jaccard similarity coefficient
- if union == 0:
- return 0
- else:
- return intersection / union
-
|