Upload 3 files
Browse files- app.py +91 -0
- requirements.txt +3 -0
- trained_model.zip +3 -0
app.py
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from transformers import AutoTokenizer, AutoModelForSequenceClassification
|
3 |
+
import torch
|
4 |
+
import zipfile
|
5 |
+
import os
|
6 |
+
|
7 |
+
# Path to the zip file
|
8 |
+
zip_file_path = "./trained_model.zip"
|
9 |
+
|
10 |
+
# Directory to extract the contents of the zip file
|
11 |
+
extracted_dir = "./trained_model"
|
12 |
+
|
13 |
+
# Extract the contents of the zip file
|
14 |
+
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
|
15 |
+
zip_ref.extractall(extracted_dir)
|
16 |
+
|
17 |
+
# Load the saved model and tokenizer
|
18 |
+
tokenizer = AutoTokenizer.from_pretrained(extracted_dir)
|
19 |
+
model = AutoModelForSequenceClassification.from_pretrained(extracted_dir)
|
20 |
+
|
21 |
+
# Define the device to run inference on (GPU if available, otherwise CPU)
|
22 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
23 |
+
|
24 |
+
# Move the model to the device
|
25 |
+
model.to(device)
|
26 |
+
|
27 |
+
|
28 |
+
|
29 |
+
# Define function for sentiment analysis
|
30 |
+
def predict_sentiment(review):
|
31 |
+
# Step 1: Tokenization
|
32 |
+
encoded_text = tokenizer(
|
33 |
+
review, padding=True, truncation=True, max_length=256, return_tensors="pt"
|
34 |
+
)
|
35 |
+
|
36 |
+
# Move input tensors to the appropriate device
|
37 |
+
input_ids = encoded_text["input_ids"].to(device)
|
38 |
+
attention_mask = encoded_text["attention_mask"].to(device)
|
39 |
+
|
40 |
+
# Step 2: Inference
|
41 |
+
with torch.no_grad():
|
42 |
+
outputs = model(input_ids, attention_mask=attention_mask)
|
43 |
+
|
44 |
+
# Step 3: Prediction with probabilities
|
45 |
+
probs = torch.softmax(outputs.logits, dim=-1)
|
46 |
+
probs = (
|
47 |
+
probs.squeeze().cpu().numpy()
|
48 |
+
) # Convert to numpy array and remove the batch dimension
|
49 |
+
|
50 |
+
# Map predicted class index to label
|
51 |
+
label_map = {0: 'سلبي', 1: 'إيجابي'}
|
52 |
+
|
53 |
+
output_dict = {label_map[i]: float(probs[i]) for i in range(len(probs))}
|
54 |
+
return output_dict
|
55 |
+
|
56 |
+
|
57 |
+
# Create Gradio interface
|
58 |
+
examples = [
|
59 |
+
["كانت تجربتي في هذا المطعم رائعة والطعام كان لذيذاً للغاية"],
|
60 |
+
["المطعم يجنن والاكل تحفة"],
|
61 |
+
["المطعم ما عجبني، الطعم مو حلو والخدمة كانت سيئة جداً، والموظفين ما كانوا محترمين. الأسعار غالية مقارنة بالجودة. ما بنصح فيه."],
|
62 |
+
["الطعام لا يستحق الثمن المدفوع، جودة سيئة للغاية."],
|
63 |
+
["الاكل كان جميل جدا والناس هناك محترمه جدا,"],
|
64 |
+
["الأكل وحش والخدمة سيئة، مش هرجع تاني للمطعم ده."],
|
65 |
+
["المطعم وايد حلو وأكلهم طيب بشكل مو طبيعي! الخدمة عندهم ممتازة والأجواء جداً مريحة. بالتأكيد راح أزورهم مرة ثانية وأنصح الكل يجربهم!"],
|
66 |
+
["تجربتي في هذا المطعم كانت مخيبة للآمال. الأطعمة كانت جافة ومُضيعة للوقت، وخدمة العملاء كانت بطيئة ولا تلبي التوقعات. بالإضافة إلى ذلك، الأسعار مبالغ فيها مقارنة بجودة الطعام المقدمة. لن أعيد زيارة هذا المكان مرة أخرى."],
|
67 |
+
|
68 |
+
]
|
69 |
+
|
70 |
+
description_html = """
|
71 |
+
<p>This model was trained by Moaz Eldsouky. You can find more about me here:</p>
|
72 |
+
<p>GitHub: <a href="https://github.com/MoazEldsouky">GitHub Profile</a></p>
|
73 |
+
<p>LinkedIn: <a href="https://www.linkedin.com/in/moaz-eldesouky-762288251/">LinkedIn Profile</a></p>
|
74 |
+
<p>Kaggle: <a href="https://www.kaggle.com/moazeldsokyx">Kaggle Profile</a></p>
|
75 |
+
<p>Email: <a href="mailto:moazeldsoky8@gmail.com">moazeldsoky8@gmail.com</a></p>
|
76 |
+
"""
|
77 |
+
|
78 |
+
|
79 |
+
iface = gr.Interface(
|
80 |
+
fn=predict_sentiment,
|
81 |
+
inputs = gr.Textbox(placeholder='أدخل تقييماً لمطعم باللغة العربية'),
|
82 |
+
outputs = gr.Label(num_top_classes=2, min_width=360),
|
83 |
+
title = "تحليل المشاعر لتقيمات المطاعم باللغة العربية",
|
84 |
+
article = description_html,
|
85 |
+
allow_flagging = "auto",
|
86 |
+
examples = examples,
|
87 |
+
)
|
88 |
+
iface.launch()
|
89 |
+
|
90 |
+
|
91 |
+
|
requirements.txt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
gradio==3.39.0
|
2 |
+
torch==2.2.1
|
3 |
+
transformers==4.37.0
|
trained_model.zip
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:c4d234caa81a49b0bc51d966b2311fbd1729b268fdc098c4128b9d2c78d7fca4
|
3 |
+
size 502923967
|