Update app.py
Browse files
app.py
CHANGED
@@ -1,114 +1,76 @@
|
|
1 |
import gradio as gr
|
2 |
-
import pandas as pd
|
3 |
from bs4 import BeautifulSoup
|
4 |
from collections import Counter
|
5 |
-
|
6 |
|
7 |
-
# دالة
|
8 |
-
def
|
|
|
|
|
|
|
|
|
9 |
try:
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
#
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
hashtags_counter = Counter()
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
]
|
30 |
-
hashtags_counter.update(hashtags)
|
31 |
-
data.append({"العنوان": title, "الهاشتاغات": ", ".join(hashtags)})
|
32 |
-
|
33 |
-
# إنشاء DataFrame للعناوين والهاشتاغات
|
34 |
-
df_titles = pd.DataFrame(data)
|
35 |
-
|
36 |
-
# تصفية الهاشتاغات حسب التكرار
|
37 |
-
df_hashtags = pd.DataFrame(
|
38 |
-
[(tag, count) for tag, count in hashtags_counter.items() if count >= min_frequency],
|
39 |
-
columns=["الهاشتاغ", "عدد التكرار"]
|
40 |
-
).sort_values(by="عدد التكرار", ascending=False)
|
41 |
-
|
42 |
-
return df_titles, df_hashtags
|
43 |
|
44 |
except Exception as e:
|
45 |
-
return f"
|
|
|
46 |
|
47 |
# إنشاء واجهة Gradio
|
48 |
def gradio_interface():
|
49 |
-
with gr.Blocks(
|
50 |
-
.
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
}
|
55 |
-
.btn-primary {
|
56 |
-
background-color: #4CAF50;
|
57 |
-
color: white;
|
58 |
-
}
|
59 |
-
.table {
|
60 |
-
width: 100%;
|
61 |
-
border-collapse: collapse;
|
62 |
-
margin-bottom: 20px;
|
63 |
-
}
|
64 |
-
.table th, .table td {
|
65 |
-
border: 1px solid #ddd;
|
66 |
-
padding: 8px;
|
67 |
-
}
|
68 |
-
.table th {
|
69 |
-
background-color: #f2f2f2;
|
70 |
-
text-align: left;
|
71 |
-
}
|
72 |
-
""") as demo:
|
73 |
-
gr.Markdown("## مستخرج الهاشتاغات والعناوين من TikTok 🏷️", elem_classes=["container"])
|
74 |
-
|
75 |
-
with gr.Row(elem_classes=["container"]):
|
76 |
-
file_input = gr.File(label="ارفع ملف HTML")
|
77 |
min_freq_slider = gr.Slider(
|
78 |
-
minimum=1, maximum=50, value=1,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
79 |
)
|
80 |
|
81 |
-
analyze_btn = gr.Button("تحليل البيانات", elem_classes=["btn-primary"])
|
82 |
-
|
83 |
-
with gr.Tabs(elem_classes=["container"]):
|
84 |
-
with gr.TabItem("العناوين"):
|
85 |
-
titles_output = gr.HTML(label="العناوين")
|
86 |
-
|
87 |
-
with gr.TabItem("الهاشتاغات"):
|
88 |
-
hashtags_output = gr.HTML(label="الهاشتاغات")
|
89 |
-
with gr.Row():
|
90 |
-
copy_btn = gr.Button("نسخ الهاشتاغات", elem_classes=["btn-primary"])
|
91 |
-
hashtags_textbox = gr.Textbox(
|
92 |
-
label="نسخ الهاشتاغات هنا", visible=False, interactive=False
|
93 |
-
)
|
94 |
-
|
95 |
-
# عند الضغط على زر التحليل
|
96 |
analyze_btn.click(
|
97 |
-
fn=
|
98 |
inputs=[file_input, min_freq_slider],
|
99 |
outputs=[titles_output, hashtags_output],
|
100 |
)
|
101 |
-
|
102 |
-
# نسخ الهاشتاغات إلى مربع النص
|
103 |
-
copy_btn.click(
|
104 |
-
fn=lambda df_titles, df_hashtags: "\n".join(df_hashtags["الهاشتاغ"].tolist()) if df_hashtags is not None else "",
|
105 |
-
inputs=[file_input, min_freq_slider],
|
106 |
-
outputs=hashtags_textbox,
|
107 |
-
)
|
108 |
-
hashtags_textbox.change(visible=True)
|
109 |
|
110 |
return demo
|
111 |
|
|
|
112 |
# تشغيل التطبيق
|
113 |
-
|
114 |
-
demo
|
|
|
|
1 |
import gradio as gr
|
|
|
2 |
from bs4 import BeautifulSoup
|
3 |
from collections import Counter
|
4 |
+
import re
|
5 |
|
6 |
+
# دالة استخراج العناوين والهاشتاغات من ملف HTML
|
7 |
+
def extract_titles_and_hashtags(file, min_frequency=1):
|
8 |
+
if not file:
|
9 |
+
return "❌ لم يتم رفع ملف", "❌ لم يتم رفع ملف"
|
10 |
+
|
11 |
+
# قراءة محتوى الملف
|
12 |
try:
|
13 |
+
content = file.read()
|
14 |
+
soup = BeautifulSoup(content, "html.parser")
|
15 |
+
|
16 |
+
# استخراج العناوين من عناصر HTML
|
17 |
+
titles = [title.get_text() for title in soup.find_all("title")]
|
18 |
+
titles_output = "\n".join(titles) if titles else "❌ لم يتم العثور على عناوين"
|
19 |
+
|
20 |
+
# استخراج النصوص المحتوية على هاشتاغات
|
21 |
+
text = soup.get_text()
|
22 |
+
hashtags = re.findall(r"#\w+", text)
|
23 |
+
|
24 |
+
# حساب تكرار الهاشتاغات وتصفيتها بناءً على التكرار
|
25 |
+
hashtags_counter = Counter(hashtags)
|
26 |
+
filtered_hashtags = [
|
27 |
+
f"{tag}: {count}" for tag, count in hashtags_counter.items() if count >= min_frequency
|
28 |
+
]
|
29 |
+
hashtags_output = "\n".join(filtered_hashtags) if filtered_hashtags else "❌ لا توجد هاشتاغات متكررة"
|
30 |
+
|
31 |
+
return titles_output, hashtags_output
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
|
33 |
except Exception as e:
|
34 |
+
return f"❌ خطأ أثناء معالجة الملف: {str(e)}", "❌ خطأ أثناء معالجة الملف"
|
35 |
+
|
36 |
|
37 |
# إنشاء واجهة Gradio
|
38 |
def gradio_interface():
|
39 |
+
with gr.Blocks() as demo:
|
40 |
+
gr.Markdown("## 🏷️ محلل العناوين والهاشتاغات المتقدم")
|
41 |
+
|
42 |
+
with gr.Row():
|
43 |
+
file_input = gr.File(label="📂 رفع ملف HTML", file_types=[".html"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
min_freq_slider = gr.Slider(
|
45 |
+
minimum=1, maximum=50, value=1, step=1,
|
46 |
+
label="📊 الحد الأدنى لتكرار الهاشتاغ"
|
47 |
+
)
|
48 |
+
|
49 |
+
with gr.Row():
|
50 |
+
analyze_btn = gr.Button("تحليل البيانات", variant="primary")
|
51 |
+
|
52 |
+
with gr.Row():
|
53 |
+
titles_output = gr.Textbox(
|
54 |
+
label="📜 العناوين المستخرجة",
|
55 |
+
lines=10,
|
56 |
+
interactive=False
|
57 |
+
)
|
58 |
+
hashtags_output = gr.Textbox(
|
59 |
+
label="🏷️ الهاشتاغات المستخرجة",
|
60 |
+
lines=10,
|
61 |
+
interactive=False
|
62 |
)
|
63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
analyze_btn.click(
|
65 |
+
fn=extract_titles_and_hashtags,
|
66 |
inputs=[file_input, min_freq_slider],
|
67 |
outputs=[titles_output, hashtags_output],
|
68 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
69 |
|
70 |
return demo
|
71 |
|
72 |
+
|
73 |
# تشغيل التطبيق
|
74 |
+
if __name__ == "__main__":
|
75 |
+
demo = gradio_interface()
|
76 |
+
demo.launch()
|