diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed8ebf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ \ No newline at end of file diff --git a/engine.py b/engine.py index 9fe7495..6c28233 100644 --- a/engine.py +++ b/engine.py @@ -1,73 +1,73 @@ from simpful import * -FS = FuzzySystem(show_banner=False) +def fuzzy_system(release_year_param, runtime_param, seasons_param, genres_param, emotions_param): -# Define fuzzy sets for the variable -# RELEASE_YEAR -release_year_newer = TriangleFuzzySet(-20, -20, 0, term="newer") -release_year_similar = TriangleFuzzySet(-20, 0, 20, term="similar") -release_year_older = TriangleFuzzySet(0, 20, 20, term="older") + FS = FuzzySystem(show_banner=False) -FS.add_linguistic_variable("RELEASE_YEAR", - LinguisticVariable([release_year_newer, release_year_similar, release_year_older], - universe_of_discourse=[-136, 136])) + # Define fuzzy sets for the variable + # RELEASE_YEAR + release_year_newer = TriangleFuzzySet(-20, -20, 0, term="newer") + release_year_similar = TriangleFuzzySet(-20, 0, 20, term="similar") + release_year_older = TriangleFuzzySet(0, 20, 20, term="older") -# RUNTIME -runtime_shorter = TriangleFuzzySet(-90, -90, 0, term="shorter") -runtime_similar = TriangleFuzzySet(-90, 0, 90, term="similar") -runtime_longer = TriangleFuzzySet(0, 90, 90, term="longer") + FS.add_linguistic_variable("RELEASE_YEAR", + LinguisticVariable([release_year_newer, release_year_similar, release_year_older], + universe_of_discourse=[-136, 136])) -FS.add_linguistic_variable("RUNTIME", LinguisticVariable([runtime_shorter, runtime_similar, runtime_longer], - universe_of_discourse=[-476, 476])) + # RUNTIME + runtime_shorter = TriangleFuzzySet(-90, -90, 0, term="shorter") + runtime_similar = TriangleFuzzySet(-90, 0, 90, term="similar") + runtime_longer = TriangleFuzzySet(0, 90, 90, term="longer") -# SEASONS -seasons_less = TriangleFuzzySet(-5, -5, 0, term="less") -seasons_similar = TriangleFuzzySet(-5, 0, 5, term="similar") -seasons_more = TriangleFuzzySet(0, 5, 5, term="more") + FS.add_linguistic_variable("RUNTIME", LinguisticVariable([runtime_shorter, runtime_similar, runtime_longer], + universe_of_discourse=[-476, 476])) -FS.add_linguistic_variable("SEASONS", LinguisticVariable([seasons_less, seasons_similar, seasons_more], - universe_of_discourse=[-84, 84])) + # SEASONS + seasons_less = TriangleFuzzySet(-5, -5, 0, term="less") + seasons_similar = TriangleFuzzySet(-5, 0, 5, term="similar") + seasons_more = TriangleFuzzySet(0, 5, 5, term="more") -# GENRES -genres_different = TriangleFuzzySet(0, 0, 0.5, term="different") -genres_similar = TriangleFuzzySet(0, 0.5, 1, term="similar") -genres_same = TriangleFuzzySet(0.5, 1, 1, term="same") + FS.add_linguistic_variable("SEASONS", LinguisticVariable([seasons_less, seasons_similar, seasons_more], + universe_of_discourse=[-84, 84])) -FS.add_linguistic_variable("GENRES", LinguisticVariable([genres_different, genres_similar, genres_same], - universe_of_discourse=[0, 1])) + # GENRES + genres_different = TriangleFuzzySet(0, 0, 0.5, term="different") + genres_similar = TriangleFuzzySet(0, 0.5, 1, term="similar") + genres_same = TriangleFuzzySet(0.5, 1, 1, term="same") -# EMOTIONS -emotions_different = TriangleFuzzySet(0, 0, 0.5, term="different") -emotions_similar = TriangleFuzzySet(0, 0.5, 1, term="similar") -emotions_same = TriangleFuzzySet(0.5, 1, 1, term="same") + FS.add_linguistic_variable("GENRES", LinguisticVariable([genres_different, genres_similar, genres_same], + universe_of_discourse=[0, 1])) -FS.add_linguistic_variable("EMOTIONS", LinguisticVariable([emotions_different, emotions_similar, emotions_same], - universe_of_discourse=[0, 1])) + # EMOTIONS + emotions_different = TriangleFuzzySet(0, 0, 0.5, term="different") + emotions_similar = TriangleFuzzySet(0, 0.5, 1, term="similar") + emotions_same = TriangleFuzzySet(0.5, 1, 1, term="same") -# RECOMMENDATION -low_recommendation = TriangleFuzzySet(0, 0, 50, term="low_recommendation") -medium_recommendation = TriangleFuzzySet(0, 50, 100, term="medium_recommendation") -high_recommendation = TriangleFuzzySet(0, 100, 100, term="high_recommendation") -FS.add_linguistic_variable("RECOMMENDATION", - LinguisticVariable([low_recommendation, medium_recommendation, high_recommendation], - universe_of_discourse=[0, 200])) + FS.add_linguistic_variable("EMOTIONS", LinguisticVariable([emotions_different, emotions_similar, emotions_same], + universe_of_discourse=[0, 1])) -# RULES -RULE1 = "IF (RELEASE_YEAR IS older) AND (RUNTIME IS longer) AND (SEASONS IS more) THEN (RECOMMENDATION IS low_recommendation)" -RULE2 = "IF (EMOTIONS IS different) AND (GENRES IS different) THEN (RECOMMENDATION IS low_recommendation)" -RULE3 = "IF (RELEASE_YEAR IS newer) AND (RUNTIME IS similar) AND (SEASONS IS less) THEN (RECOMMENDATION IS medium_recommendation)" -RULE4 = "IF (EMOTIONS IS similar) AND (GENRES IS similar) THEN (RECOMMENDATION IS medium_recommendation)" -RULE5 = "IF (RELEASE_YEAR IS similar) AND (RUNTIME IS similar) AND (SEASONS IS similar) AND (EMOTIONS IS same) AND (GENRES IS same) THEN (RECOMMENDATION IS high_recommendation)" -# Z regułami trzeba eksperymentować, można porównywać ze scorem dla sprawdzania skuteczności + # RECOMMENDATION + low_recommendation = TriangleFuzzySet(0, 0, 50, term="low_recommendation") + medium_recommendation = TriangleFuzzySet(0, 50, 100, term="medium_recommendation") + high_recommendation = TriangleFuzzySet(0, 100, 100, term="high_recommendation") + FS.add_linguistic_variable("RECOMMENDATION", + LinguisticVariable([low_recommendation, medium_recommendation, high_recommendation], + universe_of_discourse=[0, 200])) -FS.add_rules([RULE1, RULE2, RULE3, RULE4, RULE5]) + # # RULES + # RULE1 = "IF (RELEASE_YEAR IS older) AND (RUNTIME IS longer) AND (SEASONS IS more) THEN (RECOMMENDATION IS low_recommendation)" + # RULE2 = "IF (EMOTIONS IS different) AND (GENRES IS different) THEN (RECOMMENDATION IS low_recommendation)" + # RULE3 = "IF (RELEASE_YEAR IS newer) AND (RUNTIME IS similar) AND (SEASONS IS less) THEN (RECOMMENDATION IS medium_recommendation)" + # RULE4 = "IF (EMOTIONS IS similar) AND (GENRES IS similar) THEN (RECOMMENDATION IS medium_recommendation)" + # RULE5 = "IF (RELEASE_YEAR IS similar) AND (RUNTIME IS similar) AND (SEASONS IS similar) AND (EMOTIONS IS same) AND (GENRES IS same) THEN (RECOMMENDATION IS high_recommendation)" + # # Z regułami trzeba eksperymentować, można porównywać ze scorem dla sprawdzania skuteczności -# FS.set_variable("RELEASE_YEAR", -12.0) -# FS.set_variable("RUNTIME", -10.0) -# FS.set_variable("SEASONS", -2.0) -# FS.set_variable("GENRES", 50.0) -# FS.set_variable("EMOTIONS", 1.0) -# -# print(FS.inference(["RECOMMENDATION"])) + # RULES + RULE1 = f"IF (NOT (RELEASE_YEAR IS {release_year_param})) AND (NOT (RUNTIME IS {runtime_param})) AND (NOT (SEASONS IS {seasons_param})) THEN (RECOMMENDATION IS low_recommendation)" + RULE2 = f"IF (NOT (EMOTIONS IS {emotions_param})) AND (NOT (GENRES IS {genres_param})) THEN (RECOMMENDATION IS low_recommendation)" + RULE3 = f"IF (NOT (RELEASE_YEAR IS {release_year_param})) AND (RUNTIME IS {runtime_param}) AND (NOT (SEASONS IS {seasons_param})) THEN (RECOMMENDATION IS medium_recommendation)" + RULE4 = f"IF (EMOTIONS IS {emotions_param}) AND (GENRES IS {genres_param}) THEN (RECOMMENDATION IS medium_recommendation)" + RULE5 = f"IF (RELEASE_YEAR IS {release_year_param}) AND (RUNTIME IS {runtime_param}) AND (SEASONS IS {seasons_param}) AND (EMOTIONS IS {emotions_param}) AND (GENRES IS {genres_param}) THEN (RECOMMENDATION IS high_recommendation)" + FS.add_rules([RULE1, RULE2, RULE3, RULE4, RULE5]) -# FS.produce_figure(outputfile='visualize_terms.pdf') + return FS diff --git a/main.py b/main.py index b38dbf4..2a6a07e 100644 --- a/main.py +++ b/main.py @@ -16,7 +16,7 @@ from fastapi import FastAPI from scipy.spatial.distance import cosine from sklearn.preprocessing import MultiLabelBinarizer -from engine import FS +from engine import fuzzy_system app = FastAPI() data = pd.DataFrame() @@ -28,6 +28,8 @@ def inference(first: pandas.core.series.Series, second_id: str, df=None): else: second = data.loc[second_id] + FS = fuzzy_system(release_year_param='similar', runtime_param='similar', seasons_param='similar', genres_param='same', emotions_param='same') + year_diff = int(first['release_year'] - second['release_year']) FS.set_variable('RELEASE_YEAR', year_diff)