Commit ff0a0f19 authored by Wanniarachchi M.Y's avatar Wanniarachchi M.Y

Merge branch 'ER_Analysis' into 'IT20258962'

ER DIAGRAM ANALYSIS AND EXTRACTION

See merge request !9
parents f55d0806 74fba514
This diff is collapsed.
This diff is collapsed.
{"Event": ["e_id", "e_title", "e_date", "e_venue"], "Customer": ["c_id", "c_name", "c_contact_info", "c_ticket_history"], "Attendee": ["a_id", "a_event_id", "a_customer_id"], "Ticket": ["t_id", "t_price", "t_event_id", "t_capacity", "t_scanning"]}
\ No newline at end of file
["Event", "Customer", "Attendee", "Ticket"]
\ No newline at end of file
{"has": {"left": ["Event", "M"], "right": ["Attendee", "M"]}, "purchases": {"left": ["Customer", "M"], "right": ["Ticket", "M"]}, "attends": {"left": ["Attendee", "M"], "right": ["Event", "M"]}}
\ No newline at end of file
"CREATE TABLE Event (e_id VARCHAR(255), e_title VARCHAR(255), e_date VARCHAR(255), e_venue VARCHAR(255));\nCREATE TABLE Customer (c_id VARCHAR(255), c_name VARCHAR(255), c_contact_info VARCHAR(255), c_ticket_history VARCHAR(255));\nCREATE TABLE Attendee (a_id VARCHAR(255), a_event_id VARCHAR(255), a_customer_id VARCHAR(255));\nCREATE TABLE Ticket (t_id VARCHAR(255), t_price VARCHAR(255), t_event_id VARCHAR(255), t_capacity VARCHAR(255), t_scanning VARCHAR(255));\nALTER TABLE Event ADD CONSTRAINT FK_Event_Attendee FOREIGN KEY (event_id) REFERENCES Attendee(attendee_id);\nALTER TABLE Customer ADD CONSTRAINT FK_Customer_Ticket FOREIGN KEY (customer_id) REFERENCES Ticket(ticket_id);\nALTER TABLE Attendee ADD CONSTRAINT FK_Attendee_Event FOREIGN KEY (attendee_id) REFERENCES Event(event_id);"
\ No newline at end of file
File added
import cv2
import numpy as np
from spellchecker import SpellChecker
import json
from nltk.stem import SnowballStemmer
import keras_ocr
import matplotlib.pyplot as plt
pipeline = keras_ocr.pipeline.Pipeline()
stemmer = SnowballStemmer("english")
image_file = "data/ER_sim_images/2.jpg"
img = cv2.imread(image_file)
inverted_image = cv2.bitwise_not(img)
plt.imshow(inverted_image)
image_path = "temp/inverted_image1.jpg"
results_test = pipeline.recognize([image_path])
word_list=[]
for i in range(len(results_test[0])):
word_info=results_test[0][i][0]
word = word_info
word_list.append(word)
fig, ax = plt.subplots(figsize=(10, 10))
keras_ocr.tools.drawAnnotations(plt.imread(image_path), results_test[0], ax=ax)
ax.set_title('Extracted Result Example')
plt.show()
import cv2
from spellchecker import SpellChecker
import keras_ocr
pipeline = keras_ocr.pipeline.Pipeline()
spell = SpellChecker()
def extract_all_word(image_path):
inv_img_path = "temp/inverted_image1.jpg"
# Invert the images
inverted_image1 = cv2.bitwise_not(cv2.imread(image_path, cv2.IMREAD_GRAYSCALE))
cv2.imwrite(inv_img_path, inverted_image1)
results = pipeline.recognize([inv_img_path])
word_list = [word[0] for word in results[0]]
# Correct the recognized words
corrected_word_list = []
for word in word_list:
corrected_word = spell.correction(word)
corrected_word_list.append(corrected_word)
return word_list, corrected_word_list
words, corected_words = extract_all_word('static/er_diagram.png')
words
with open('data/entity_list.json', 'r') as json_file:
json_word_list = json.load(json_file)
json_word_list = [word.lower() for word in json_word_list]
pred_list = [word.lower() for word in words]
for word in json_word_list:
if word in pred_list:
print(f"'{word}'")
else:
print(f"'{word}' is not in the predicted list.")
pred_list
with open('data/entity_list.json', 'r') as json_file:
json_word_list = json.load(json_file)
json_word_list = [word.lower() for word in json_word_list]
# Convert to lowercase
pred_list = [word.lower() for word in words]
match_count = 0
for word in json_word_list:
if word in pred_list:
print("Matched Entity:", word)
match_count += 1 # Increment match_count
pred_list.remove(word)
total_words = len(json_word_list)
marks1 = match_count / total_words
print(f"Allocated Entity Marks: {marks1}")
with open('data/attributes.json', 'r') as json_file:
attributes_data = json.load(json_file)
match_count2 = 0
# Extract all attributes into a list
all_attributes = []
for entity, attributes in attributes_data.items():
for attribute in attributes:
# Split the attribute by underscores (_)
separated_attribute = attribute.split("_")[-1]
all_attributes.append(separated_attribute.lower())
all_attributes = [attr.lower() for attr in all_attributes]
for attribute in all_attributes:
if attribute in pred_list:
match_count2 = match_count2+1
print(f"Matched Attribute:'{attribute}'")
pred_list.remove(attribute)
else:
print(f"'{attribute}' is not matched.")
total_words = len(all_attributes)
marks2 = match_count2 / total_words
print(f"Allocated Attribute Marks: {marks2}")
pred_list
with open('data/relations.json', 'r') as json_file:
relationships_data = json.load(json_file)
# Extract the first word from the keys
selected_verbs = [stemmer.stem(key.split()[0]) for key in relationships_data.keys()]
print(selected_verbs)
stemmed_prediction_list = [stemmer.stem(word) for word in pred_list]
print(stemmed_prediction_list)
marks_count = 0
for word in stemmed_prediction_list:
if word in selected_verbs:
marks_count += 1
total_words = len(selected_verbs)
marks3 = marks_count / total_words
print(f"Allocated Relationship Marks: {marks3}")
final_marks = (marks1 + marks2 + marks3) / 3 * 10
rounded_final_marks = round(final_marks, 2)
print("Your have,", rounded_final_marks, "/10 for your ER diagram:")
import nltk
nltk.download('wordnet')
matplotlib==3.7.1
nltk==3.8.1
numpy==1.23.5
pandas==2.0.2
scikit-learn==1.2.2
seaborn==0.12.2
joblib==1.2.0
imutils==0.5.4
Flask==2.3.2
keras-ocr==0.8.9
openai==0.27.8
tensorflow==2.12.0
seaborn==0.12.2
wheel==0.40.0
spellchecker==0.4
yarl==1.9.2
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Add the Bootstrap CSS link here -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<!-- Add Font Awesome CSS link here -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dashboard</title>
<style>
/* Additional CSS styles */
.navbar {
background-color: #333;
}
.navbar-nav .nav-link {
color: white;
}
.navbar-nav .nav-link:hover {
color: yellow;
}
.carousel-container {
background-color: #000; /* Set your desired background color */
overflow: hidden;
}
.carousel-item img {
width: 100%;
height: 100%;
object-fit: cover; /* Ensure the image covers the entire slide */
}
.carousel {
width: 100%; /* Set carousel width to 100% */
height: 100%;
}
</style>
</head>
<body>
<!-- Navigation Bar -->
<nav class="navbar navbar-expand-lg navbar-dark">
<a class="navbar-brand" href="#">ER DIAGRAM TOOL</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav mr-auto">
{% if user_role == 'student' %}
<li class="nav-item">
<a class="nav-link" href="{{ url_for('generate_er_diagram') }}"><i class="fas fa-database"></i> ER Diagram Generator</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('quiz') }}"><i class="fas fa-question-circle"></i> AI Based Quiz</a>
</li>
{% elif user_role == 'teacher' %}
<li class="nav-item">
<a class="nav-link" href="{{ url_for('generate_er_diagram') }}"><i class="fas fa-database"></i> ER Diagram Generator</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('extract') }}"><i class="fas fa-project-diagram"></i> ER Diagram Extractor</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('similarity') }}"><i class="fas fa-search"></i> Similarity Checker</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('quiz_count') }}"><i class="fas fa-search"></i> Quiz count</a>
</li>
{% endif %}
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="{{ url_for('logout') }}"><i class="fas fa-sign-out-alt"></i> Logout {{user_role}}</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('home') }}"><i class="fas fa-home"></i> Home</a>
</li>
</ul>
</div>
</nav>
<!-- Content Area -->
<!--<div class="container">-->
<div id="carouselExample" class="carousel slide" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img src="/static/diagram.webp" class="d-block w-100" alt="Slide 1">
</div>
<div class="carousel-item">
<img src="/static/diagram2.webp" class="d-block w-100" alt="Slide 2">
</div>
<div class="carousel-item">
<img src="/static/diagram3.webp" class="d-block w-100" alt="Slide 3">
</div>
<div class="carousel-item">
<img src="/static/diagram4.webp" class="d-block w-100" alt="Slide 4">
</div>
</div>
<a class="carousel-control-prev" href="#carouselExample" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExample" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
<!--</div>-->
<!-- Bootstrap JS, Popper.js, and jQuery scripts -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@2.9.1/dist/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ER Diagram Extraction</title>
<!-- Bootstrap CSS -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom Styles -->
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f7f9;
}
header {
background-color: #343a40;
color: #ffffff;
padding: 1.5rem 0;
text-align: center;
margin-bottom: 2rem;
border-bottom: 3px solid #e7e7e7;
}
.container {
background-color: #fff;
border-radius: 8px;
padding: 2rem;
box-shadow: 0px 10px 25px rgba(0, 0, 0, 0.05);
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 2rem;
}
table, th, td {
border: 1px solid #e2e8f0;
}
th, td {
padding: 1rem;
text-align: left;
}
</style>
</head>
<body>
<header>
<h2>ER Diagram Extraction</h2>
</header>
<div class="container mt-4">
<form action="/extract" method="POST" enctype="multipart/form-data">
<div class="form-group">
<label for="image"><strong>Upload ER Diagram:</strong></label>
<input type="file" name="image" class="form-control">
</div>
<div class="d-flex justify-content-between">
<button type="submit" class="btn btn-primary">Extract</button>
<a href="{{ url_for('dashboard') }}" class="btn btn-outline-secondary">Back</a>
</div>
</form>
{% if result %}
<h3 class="mt-5">Extraction Results</h3>
<table class="table table-bordered table-hover">
<thead class="bg-light">
<tr>
<th>Word</th>
<th>Corrected Word</th>
</tr>
</thead>
<tbody>
{% for i in range(result['words']|length) %}
<tr>
<td>{{ result['words'][i] }}</td>
<td>{{ result['corrected_words'][i] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<h4>Matched Entities</h4>
<ul>
{% for entity in result['matched_entities'] %}
<li>{{ entity }}</li>
{% endfor %}
</ul>
<h4>Marks</h4>
<ul>
<li>Marks 1: {{ result['marks1'] }}</li>
<li>Marks 2: {{ result['marks2'] }}</li>
<li>Marks 3: {{ result['marks3'] }}</li>
<li>Final Marks: {{ result['final_marks'] }}</li>
</ul>
{% else %}
<p class="mt-4 text-muted">No results available. Please upload an ER Diagram to extract.</p>
{% endif %}
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Add the Bootstrap CSS link here -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ER Diagram Tool</title>
<style>
/* Additional CSS styles */
body, html {
height: 100%;
background: url('/static/back.png') no-repeat center center fixed;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
.container {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
.card {
width: fit-content;
}
</style>
</head>
<body>
<div class="container">
<div class="card">
<div class="card-body text-center">
<h1 class="card-title">WELCOME TO THE ER DIAGRAM TOOL</h1>
<p class="card-text">Please register or log in to use this tool.</p>
<a href="{{ url_for('login') }}" class="btn btn-primary btn-lg btn-block">Login</a>
<a href="{{ url_for('register') }}" class="btn btn-success btn-lg btn-block mt-3">Register</a>
</div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Add the Bootstrap CSS link here -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
<style>
body {
font-family: Arial, sans-serif;
background: url('/static/cover.png') no-repeat center center fixed;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
}
.card {
max-width: 400px;
width: 100%;
}
.card-body {
padding: 20px;
}
input[type="text"], input[type="password"] {
font-size: 16px;
}
</style>
</head>
<body>
<div class="card">
<div class="card-body text-center">
<h1 class="card-title">LOGIN PAGE</h1>
<form method="POST" action="">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.username(class="form-control", placeholder="Username") }}
</div>
<div class="form-group">
{{ form.password(class="form-control", placeholder="Password") }}
</div>
<button type="submit" class="btn btn-primary btn-block">Login</button>
</form>
<a href="{{ url_for('register') }}" class="mt-3">Don't have an account? Sign Up</a>
<div>
<a href="{{ url_for('home') }}">Back to Home</a>
</div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Add the Bootstrap CSS link here -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Register</title>
<style>
body {
font-family: Arial, sans-serif;
background: url('/static/cover.png') no-repeat center center fixed;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
}
.card {
max-width: 400px;
width: 100%;
}
.card-body {
padding: 20px;
}
input[type="text"], input[type="password"] {
font-size: 16px;
}
</style>
</head>
<body>
<div class="card">
<div class="card-body text-center">
<h1 class="card-title">REGISTER PAGE</h1>
<form method="POST" action="">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.username(class="form-control", placeholder="Username") }}
</div>
<div class="form-group">
{{ form.password(class="form-control", placeholder="Password") }}
</div>
<button type="submit" class="btn btn-success btn-block">Register</button>
</form>
<a href="{{ url_for('login') }}" class="mt-3">Already have an account? Log In</a>
<div>
<a href="{{ url_for('home') }}">Back to Home</a>
</div>
</div>
</div>
</body>
</html>
id,username,password,role
1,student,student,student
2,teacher,teacher,teacher
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment