WhotookNima commited on
Commit
8e675fe
·
verified ·
1 Parent(s): edfaa2b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -34
app.py CHANGED
@@ -1,52 +1,62 @@
1
  from fastapi import FastAPI
2
- from transformers import AutoTokenizer, AutoModelForCausalLM
3
- import torch
 
 
4
 
5
  app = FastAPI()
6
 
7
- # Ladda GPT-SW3-126M
8
- model_name = "AI-Sweden-Models/gpt-sw3-126m"
9
- try:
10
- tokenizer = AutoTokenizer.from_pretrained(model_name)
11
- model = AutoModelForCausalLM.from_pretrained(model_name)
12
- except Exception as e:
13
- print(f"Error loading model: {str(e)}")
14
- raise e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  @app.post("/parse")
17
  async def parse_user_request(request: str):
18
  if not request or len(request) > 200:
19
  return {"error": "Ogiltig eller för lång begäran"}
20
  try:
21
- # Prompt för att extrahera vara och attribut
22
- prompt = f"""Analysera följande begäran på svenska och extrahera nyckelinformation som vara, färg, pris eller andra attribut. Returnera resultatet som en sträng med formatet "vara:namn,attribut1:värde,attribut2:värde" (bara relevanta attribut, utan tomma fält). Om ingen vara identifieras, returnera "error:ingen vara". Exempel:
23
- - Input: "Jag vill ha en röd bil" -> "vara:bil,färg:röd"
24
- - Input: "Jag vill ha en ros, helst billigt" -> "vara:ros,pris:billigt"
25
-
26
- Begäran: {request}
27
- Svar: """
28
-
29
- # Tokenisera prompten
30
- input_ids = tokenizer(prompt, return_tensors="pt").input_ids
31
 
32
- # Generera svar
33
- with torch.no_grad():
34
- output = model.generate(
35
- input_ids,
36
- max_new_tokens=20,
37
- do_sample=False,
38
- pad_token_id=tokenizer.pad_token_id,
39
- eos_token_id=tokenizer.eos_token_id
40
- )
41
 
42
- # Dekoda och extrahera svaret
43
- result = tokenizer.decode(output[0], skip_special_tokens=True).strip()
44
- result = result.split("Svar: ")[-1].strip()
 
 
 
45
 
46
- return {"result": result}
47
  except Exception as e:
48
  return {"error": f"Fel vid parsning: {str(e)}"}
49
 
50
  @app.get("/")
51
  async def root():
52
- return {"Nytt!"}
 
1
  from fastapi import FastAPI
2
+ import spacy
3
+ from spacy.language import Language
4
+ from spacy.tokens import Span
5
+ import json
6
 
7
  app = FastAPI()
8
 
9
+ # Ladda svensk spaCy-modell
10
+ nlp = spacy.load("sv_core_news_sm")
11
+
12
+ # Ladda entitetslistor från JSON (för skalbarhet)
13
+ with open("entities.json") as f:
14
+ entities = json.load(f)
15
+ ITEMS = set(entities["items"])
16
+ COLORS = set(entities["colors"])
17
+ PRICES = set(entities["prices"])
18
+
19
+ # Regelbaserad matcher för entiteter
20
+ @Language.component("custom_matcher")
21
+ def custom_matcher(doc):
22
+ spans = []
23
+ for token in doc:
24
+ text = token.text.lower()
25
+ if text in ITEMS:
26
+ spans.append(Span(doc, token.i, token.i + 1, label="VARA"))
27
+ elif text in COLORS:
28
+ spans.append(Span(doc, token.i, token.i + 1, label="FÄRG"))
29
+ elif text in PRICES:
30
+ spans.append(Span(doc, token.i, token.i + 1, label="PRIS"))
31
+ doc.ents = spans
32
+ return doc
33
+
34
+ nlp.add_pipe("custom_matcher")
35
 
36
  @app.post("/parse")
37
  async def parse_user_request(request: str):
38
  if not request or len(request) > 200:
39
  return {"error": "Ogiltig eller för lång begäran"}
40
  try:
41
+ # Analysera text med spaCy
42
+ doc = nlp(request)
43
+ entities = {ent.label_: ent.text.lower() for ent in doc.ents}
 
 
 
 
 
 
 
44
 
45
+ # Om ingen vara hittades, returnera fel
46
+ if "VARA" not in entities:
47
+ return {"result": "error:ingen vara"}
 
 
 
 
 
 
48
 
49
+ # Skapa strukturerad sträng
50
+ result_parts = [f"vara:{entities['VARA']}"]
51
+ if "FÄRG" in entities:
52
+ result_parts.append(f"färg:{entities['FÄRG']}")
53
+ if "PRIS" in entities:
54
+ result_parts.append(f"pris:{entities['PRIS']}")
55
 
56
+ return {"result": ",".join(result_parts)}
57
  except Exception as e:
58
  return {"error": f"Fel vid parsning: {str(e)}"}
59
 
60
  @app.get("/")
61
  async def root():
62
+ return {"message": "Request Parser API is running!"}