File size: 3,131 Bytes
03a8026
 
 
 
 
 
 
 
 
 
 
 
 
90748dd
 
03a8026
 
 
 
9c2c875
90748dd
03a8026
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
406142b
03a8026
 
406142b
03a8026
 
 
 
 
 
 
406142b
03a8026
 
 
 
 
f956d85
03a8026
 
 
 
 
f956d85
03a8026
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from transformers import pipeline, set_seed
from transformers import AutoTokenizer
import re
from utils import ext
from utils.ext import pure_comma_separation

from decouple import config
import os

from utils.api import generate_cook_image
from utils.translators.translate_recepie import translate_recepie
from utils.translators.translate_input import translate_input

os.environ['TRANSFORMERS_CACHE'] = './cache'


model_name_or_path = "flax-community/t5-recipe-generation"
task = "text2text-generation"

tokenizer = AutoTokenizer.from_pretrained(
    model_name_or_path)
generator = pipeline(task, model=model_name_or_path,
                     tokenizer=model_name_or_path)

prefix = "items: "


chef_top = {
    "max_length": 512,
    "min_length": 64,
    "no_repeat_ngram_size": 3,
    "do_sample": True,
    "top_k": 60,
    "top_p": 0.95,
    "num_return_sequences": 1,
    "return_tensors": True,
    "return_text": False
}
chef_beam = {
    "max_length": 512,
    "min_length": 64,
    "no_repeat_ngram_size": 3,
    "early_stopping": True,
    "num_beams": 5,
    "length_penalty": 1.5,
    "num_return_sequences": 1
}

generation_kwargs = {
    "max_length": 512,
    "min_length": 64,
    "no_repeat_ngram_size": 3,
    "do_sample": True,
    "top_k": 60,
    "top_p": 0.95
}


def load_api():
    api_key = config("API_KEY")
    api_id = config("API_ID")
    return {"KEY": api_key, "ID": api_id}


def skip_special_tokens_and_prettify(text):

    data = {"title": "", "ingredients": [], "directions": []}

    text = text + '$'

    pattern = r"(\w+:)(.+?(?=\w+:|\$))"

    for match in re.findall(pattern, text):
        if match[0] == 'title:':
            data["title"] = match[1]
        elif match[0] == 'ingredients:':
            data["ingredients"] = [ing.strip() for ing in match[1].split(',')]
        elif match[0] == 'directions:':
            data["directions"] = [d.strip() for d in match[1].split('.')]
        else:
            pass

    data["ingredients"] = ext.ingredients(
        data["ingredients"])

    data["directions"] = ext.directions(data["directions"])

    data["title"] = ext.title(data["title"])

    return data


def generation_function(texts, lang="en", chef="top"):

    langs = ['ru', 'en']
    chefs = {'top': chef_top, 'beam': chef_beam}
    api_credentials = load_api()

    if lang != "en" and lang in langs:
        texts = translate_input(texts, lang)

    output_ids = generator(
        texts,
        ** chefs[chef]
    )[0]["generated_token_ids"]

    recepie = tokenizer.decode(output_ids, skip_special_tokens=False)

    generated_recipe = skip_special_tokens_and_prettify(recepie)
    original_title = generated_recipe["title"]

    if lang != "en" and lang in langs:
        generated_recipe = translate_recepie(generated_recipe, lang)

    cook_image = generate_cook_image(
        original_title, app_id=api_credentials['ID'], app_key=api_credentials['KEY'])

    generated_recipe["image"] = cook_image

    return generated_recipe


items = [
    "macaroni, butter, salt, bacon, milk, flour, pepper, cream corn",
    "provolone cheese, bacon, bread, ginger"
]