iisadia commited on
Commit
fc8383a
·
verified ·
1 Parent(s): 7e3820a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +137 -66
app.py CHANGED
@@ -1,71 +1,142 @@
1
- # app.py
2
-
3
- from transformers import pipeline
4
-
5
- # Load Zero-Shot Classification Model (for detecting Requirement Type, Domain, Stakeholders, and Defects)
6
- classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
7
-
8
- # Load T5 model for Rewriting (Paraphrasing)
9
- from transformers import T5ForConditionalGeneration, T5Tokenizer
10
-
11
- t5_model = T5ForConditionalGeneration.from_pretrained("t5-small")
12
- t5_tokenizer = T5Tokenizer.from_pretrained("t5-small")
13
-
14
- # Function to classify requirement type (Functional/Non-Functional)
15
- def classify_requirement_type(requirement):
16
- candidate_labels = ["Functional", "Non-Functional"]
17
- result = classifier(requirement, candidate_labels)
18
- return result['labels'][0]
19
-
20
- # Function to identify stakeholders
21
- def identify_stakeholders(requirement):
22
- candidate_labels = ["End User", "Developer", "System Analyst", "Project Manager"]
23
- result = classifier(requirement, candidate_labels)
24
- return result['labels'][0]
25
-
26
- # Function to classify domain of the requirement
27
- def classify_domain(requirement):
28
- candidate_labels = ["Bank", "Healthcare", "Education", "Finance", "Cybersecurity", "E-commerce"]
29
- result = classifier(requirement, candidate_labels)
30
- return result['labels'][0]
31
-
32
- # Function to detect defects (e.g., Ambiguity, Incompleteness)
33
- def detect_defects(requirement):
34
- candidate_labels = ["Ambiguity", "Incompleteness", "Security Flaw", "Redundancy", "Performance Issue"]
35
- result = classifier(requirement, candidate_labels)
36
- return result['labels'][0]
37
-
38
- # Function to rewrite the requirement in a simpler way using T5
39
- def rewrite_requirement(requirement):
40
- input_text = "paraphrase: " + requirement
41
- input_ids = t5_tokenizer.encode(input_text, return_tensors="pt", max_length=512, truncation=True)
42
-
43
- output_ids = t5_model.generate(input_ids, max_length=150, num_beams=5, early_stopping=True)
44
- output_text = t5_tokenizer.decode(output_ids[0], skip_special_tokens=True)
45
-
46
- return output_text
47
-
48
- # Main function to take input requirement and process it
49
- def process_requirement(requirement):
50
- requirement_type = classify_requirement_type(requirement)
51
- stakeholder = identify_stakeholders(requirement)
52
- domain = classify_domain(requirement)
53
- defects = detect_defects(requirement)
54
- rewritten_requirement = rewrite_requirement(requirement)
55
-
56
  return {
57
- "Requirement Type": requirement_type,
58
- "Stakeholder": stakeholder,
 
59
  "Domain": domain,
60
  "Defects": defects,
61
- "Rewritten Requirement": rewritten_requirement
62
  }
63
 
64
- if __name__ == "__main__":
65
- # Example usage:
66
- requirement = input("Enter the software requirement: ")
67
- result = process_requirement(requirement)
68
-
69
- # Print the results
70
- for key, value in result.items():
71
- print(f"{key}: {value}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+ from fpdf import FPDF
4
+ import pdfplumber
5
+
6
+ # Mistral API key (replace with your key)
7
+ API_KEY = "gz6lDXokxgR6cLY72oomALWcm7vhjzQ"
8
+ MISTRAL_API_URL = "https://api.mistral.ai/v1/chat/completions"
9
+
10
+ # Function to call Mistral API
11
+ def call_mistral_api(prompt):
12
+ headers = {
13
+ "Authorization": f"Bearer {API_KEY}",
14
+ "Content-Type": "application/json"
15
+ }
16
+ payload = {
17
+ "model": "mistral-medium",
18
+ "messages": [
19
+ {"role": "user", "content": prompt}
20
+ ]
21
+ }
22
+ response = requests.post(MISTRAL_API_URL, headers=headers, json=payload)
23
+ if response.status_code == 200:
24
+ return response.json()['choices'][0]['message']['content']
25
+ else:
26
+ return f"Error: {response.status_code}, {response.text}"
27
+
28
+ # Function to analyze a single requirement
29
+ def analyze_requirement(requirement):
30
+ # Detect requirement type
31
+ type_prompt = f"Classify the following requirement as Functional or Non-Functional:\n\n{requirement}\n\nType:"
32
+ req_type = call_mistral_api(type_prompt)
33
+
34
+ # Identify stakeholders
35
+ stakeholders_prompt = f"Identify the stakeholders for the following requirement:\n\n{requirement}\n\nStakeholders:"
36
+ stakeholders = call_mistral_api(stakeholders_prompt)
37
+
38
+ # Classify domain
39
+ domain_prompt = f"Classify the domain for the following requirement (e.g., Bank, Healthcare, etc.):\n\n{requirement}\n\nDomain:"
40
+ domain = call_mistral_api(domain_prompt)
41
+
42
+ # Detect defects
43
+ defects_prompt = f"Detect any defects in the following requirement (e.g., Ambiguity, Incompleteness, etc.):\n\n{requirement}\n\nDefects:"
44
+ defects = call_mistral_api(defects_prompt)
45
+
46
+ # Rewrite requirement
47
+ rewrite_prompt = f"Rewrite the following requirement in a simpler form:\n\n{requirement}\n\nSimplified Requirement:"
48
+ rewritten = call_mistral_api(rewrite_prompt)
49
+
 
 
 
 
 
 
50
  return {
51
+ "Requirement": requirement,
52
+ "Type": req_type,
53
+ "Stakeholders": stakeholders,
54
  "Domain": domain,
55
  "Defects": defects,
56
+ "Rewritten": rewritten
57
  }
58
 
59
+ # Function to process multiple requirements
60
+ def process_requirements(input_text, uploaded_file):
61
+ requirements = []
62
+
63
+ # If a file is uploaded, extract text from the PDF
64
+ if uploaded_file:
65
+ with pdfplumber.open(uploaded_file) as pdf:
66
+ for page in pdf.pages:
67
+ requirements.extend(page.extract_text().split("\n"))
68
+
69
+ # If text input is provided, split into individual requirements
70
+ if input_text:
71
+ requirements.extend(input_text.split("\n"))
72
+
73
+ # Analyze each requirement
74
+ results = []
75
+ for req in requirements:
76
+ if req.strip(): # Ignore empty lines
77
+ results.append(analyze_requirement(req.strip()))
78
+
79
+ return results
80
+
81
+ # Function to generate a PDF report
82
+ def generate_pdf_report(results):
83
+ pdf = FPDF()
84
+ pdf.add_page()
85
+ pdf.set_font("Arial", size=12)
86
+
87
+ for result in results:
88
+ pdf.cell(200, 10, txt=f"Requirement: {result['Requirement']}", ln=True)
89
+ pdf.cell(200, 10, txt=f"Type: {result['Type']}", ln=True)
90
+ pdf.cell(200, 10, txt=f"Stakeholders: {result['Stakeholders']}", ln=True)
91
+ pdf.cell(200, 10, txt=f"Domain: {result['Domain']}", ln=True)
92
+ pdf.cell(200, 10, txt=f"Defects: {result['Defects']}", ln=True)
93
+ pdf.cell(200, 10, txt=f"Rewritten: {result['Rewritten']}", ln=True)
94
+ pdf.cell(200, 10, txt="-" * 50, ln=True)
95
+
96
+ pdf_output = "requirements_report.pdf"
97
+ pdf.output(pdf_output)
98
+ return pdf_output
99
+
100
+ # Gradio interface
101
+ def app_interface(input_text, uploaded_file):
102
+ results = process_requirements(input_text, uploaded_file)
103
+ pdf_report = generate_pdf_report(results)
104
+
105
+ # Display results in a clean format
106
+ output_text = ""
107
+ for result in results:
108
+ output_text += f"Requirement: {result['Requirement']}\n"
109
+ output_text += f"Type: {result['Type']}\n"
110
+ output_text += f"Stakeholders: {result['Stakeholders']}\n"
111
+ output_text += f"Domain: {result['Domain']}\n"
112
+ output_text += f"Defects: {result['Defects']}\n"
113
+ output_text += f"Rewritten: {result['Rewritten']}\n"
114
+ output_text += "-" * 50 + "\n\n"
115
+
116
+ return output_text, pdf_report
117
+
118
+ # Gradio app
119
+ title = "Requirement Analysis App"
120
+ description = """
121
+ This app analyzes software requirements using the Mistral model.
122
+ You can either enter requirements manually or upload a PDF file containing requirements.
123
+ """
124
+ team_name = "Team Innovators"
125
+
126
+ interface = gr.Interface(
127
+ fn=app_interface,
128
+ inputs=[
129
+ gr.Textbox(label="Enter Requirements (one per line)"),
130
+ gr.File(label="Upload PDF File (optional)")
131
+ ],
132
+ outputs=[
133
+ gr.Textbox(label="Analysis Results"),
134
+ gr.File(label="Download PDF Report")
135
+ ],
136
+ title=title,
137
+ description=description,
138
+ theme="soft"
139
+ )
140
+
141
+ # Add team name to the interface
142
+ interface.launch()