File size: 1,931 Bytes
5bbbd7a
 
 
ebbae50
5bbbd7a
 
ebbae50
5bbbd7a
ebbae50
5bbbd7a
ebbae50
5bbbd7a
 
ebbae50
 
d671e56
ebbae50
 
 
d671e56
ebbae50
 
5bbbd7a
ebbae50
 
 
 
 
 
 
 
5bbbd7a
ebbae50
5bbbd7a
ebbae50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5bbbd7a
ebbae50
 
 
5bbbd7a
ebbae50
 
 
5bbbd7a
 
ebbae50
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
import gradio as gr
from sentence_transformers import SentenceTransformer, util

# Load model once at startup
model = SentenceTransformer("sentence-transformers/paraphrase-mpnet-base-v2")

def find_matching_issues(newIssue, nearbyIssues, threshold=0.75):
    """
    Finds similar issues for a new complaint.
    """
    if not nearbyIssues:
        return []

    # Encode new issue
    new_emb = model.encode(newIssue, convert_to_tensor=True)

    # Encode all nearby issues
    issue_texts = [item["issue"] for item in nearbyIssues]
    issue_embs = model.encode(issue_texts, convert_to_tensor=True)

    # Compute cosine similarity
    cosine_scores = util.pytorch_cos_sim(new_emb, issue_embs)[0]

    matches = []
    for i, score in enumerate(cosine_scores):
        if score.item() >= threshold:
            matches.append({
                "ID": nearbyIssues[i]["ID"],
                "issue": nearbyIssues[i]["issue"],
                "similarity": round(score.item(), 3)
            })

    return matches

# Wrapper for Gradio interface
def match_api(newIssue, issues_text, threshold):
    """
    issues_text: input like '123: electricity problem; 124: water problem'
    """
    # Parse nearby issues (simple format: ID: text)
    nearbyIssues = []
    for part in issues_text.split(";"):
        if ":" in part:
            ID, issue = part.split(":", 1)
            nearbyIssues.append({"ID": ID.strip(), "issue": issue.strip()})

    matches = find_matching_issues(newIssue, nearbyIssues, threshold)
    return matches

# Gradio interface
iface = gr.Interface(
    fn=match_api,
    inputs=[
        gr.Textbox(label="New Issue"),
        gr.Textbox(label="Nearby Issues (format: ID: issue; ID: issue)"),
        gr.Slider(0, 1, value=0.7, step=0.05, label="Threshold")
    ],
    outputs="json",
    title="Issue Matcher API",
    description="Finds similar issues based on semantic similarity."
)

iface.launch()