Alpha108 commited on
Commit
04515a0
·
verified ·
1 Parent(s): 54dca76

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +64 -0
app.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import streamlit as st
3
+ from sentence_transformers import SentenceTransformer, util
4
+
5
+ # Load embedding model
6
+ @st.cache_resource
7
+ def load_model():
8
+ return SentenceTransformer("all-MiniLM-L6-v2")
9
+
10
+ model = load_model()
11
+
12
+ # Fetch jobs from RemoteOK
13
+ def fetch_jobs():
14
+ url = "https://remoteok.com/api"
15
+ try:
16
+ response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
17
+ data = response.json()
18
+ jobs = data[1:15] # skip metadata, get first 15 jobs
19
+ return jobs
20
+ except Exception as e:
21
+ st.error(f"Error fetching jobs: {e}")
22
+ return []
23
+
24
+ # Match jobs with user skills
25
+ def match_jobs(user_skills):
26
+ jobs = fetch_jobs()
27
+ if not jobs:
28
+ return []
29
+
30
+ user_embedding = model.encode(user_skills, convert_to_tensor=True)
31
+
32
+ results = []
33
+ for job in jobs:
34
+ desc = f"{job.get('position','')} at {job.get('company','')}. Tags: {job.get('tags','')}"
35
+ job_embedding = model.encode(desc, convert_to_tensor=True)
36
+ similarity = util.cos_sim(user_embedding, job_embedding).item()
37
+ results.append({
38
+ "company": job.get("company"),
39
+ "position": job.get("position"),
40
+ "url": job.get("url"),
41
+ "score": round(similarity * 100, 2)
42
+ })
43
+
44
+ results = sorted(results, key=lambda x: x["score"], reverse=True)
45
+ return results[:5]
46
+
47
+ # ---------------- UI ----------------
48
+ st.set_page_config(page_title="AI Freelancer Job Matcher", page_icon="🤖", layout="wide")
49
+
50
+ st.title("🤖 AI Freelancer Job Matcher")
51
+ st.markdown("Find jobs in real-time from **RemoteOK**, matched to your skills using AI.")
52
+
53
+ skills = st.text_input("Enter your skills (comma separated)", "Python, AI, Docker")
54
+
55
+ if st.button("Find Jobs"):
56
+ results = match_jobs(skills)
57
+ if results:
58
+ for job in results:
59
+ st.subheader(f"🔹 {job['position']} at {job['company']}")
60
+ st.write(f"**Match:** {job['score']}%")
61
+ st.markdown(f"[Apply here]({job['url']})")
62
+ st.markdown("---")
63
+ else:
64
+ st.warning("No jobs found. Try again later.")