|
|
|
|
|
<!DOCTYPE html> |
|
|
<html> |
|
|
<head> |
|
|
<title>Disambiguation Results</title> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> |
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
|
|
<style> |
|
|
body { |
|
|
background: linear-gradient(135deg, #f8fafc 0%, #e3e6f3 100%); |
|
|
min-height: 100vh; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
} |
|
|
.navbar { |
|
|
box-shadow: 0 2px 8px rgba(0,0,0,0.07); |
|
|
} |
|
|
.highlight-word { |
|
|
background-color: #4f8cff; |
|
|
color: white; |
|
|
padding: 2px 8px; |
|
|
border-radius: 4px; |
|
|
font-weight: 500; |
|
|
} |
|
|
.main-container { |
|
|
max-width: 800px; |
|
|
margin: 0 auto 2rem auto; |
|
|
padding: 0; |
|
|
} |
|
|
.text-card { |
|
|
background: white; |
|
|
border-radius: 16px; |
|
|
box-shadow: 0 4px 24px rgba(79,140,255,0.07); |
|
|
padding: 1.5rem; |
|
|
margin-bottom: 1.5rem; |
|
|
} |
|
|
.context-badge { |
|
|
margin-right: 5px; |
|
|
margin-bottom: 5px; |
|
|
background-color: #e3e6f3; |
|
|
color: #4f8cff; |
|
|
border-radius: 20px; |
|
|
font-weight: 400; |
|
|
} |
|
|
.lexname-badge { |
|
|
background-color: #4f8cff; |
|
|
color: white; |
|
|
border-radius: 20px; |
|
|
font-weight: 500; |
|
|
} |
|
|
.sense-card { |
|
|
background: white; |
|
|
border-radius: 16px; |
|
|
box-shadow: 0 4px 24px rgba(79,140,255,0.07); |
|
|
margin-bottom: 1.5rem; |
|
|
transition: all 0.3s ease; |
|
|
border: none; |
|
|
} |
|
|
.sense-card:hover { |
|
|
transform: translateY(-5px); |
|
|
box-shadow: 0 8px 30px rgba(79,140,255,0.12); |
|
|
} |
|
|
.best-sense-card { |
|
|
border-left: 5px solid #10b981; |
|
|
} |
|
|
.sense-icon { |
|
|
font-size: 2rem; |
|
|
margin-bottom: 1rem; |
|
|
color: #4f8cff; |
|
|
} |
|
|
.feedback-btn { |
|
|
border-radius: 20px; |
|
|
padding: 0.4rem 1rem; |
|
|
border: none; |
|
|
background-color: #e3e6f3; |
|
|
color: #4f8cff; |
|
|
transition: all 0.2s ease; |
|
|
} |
|
|
.feedback-btn:hover { |
|
|
background-color: #4f8cff; |
|
|
color: white; |
|
|
} |
|
|
.algorithm-info { |
|
|
font-size: 0.9rem; |
|
|
color: #6c757d; |
|
|
} |
|
|
.section-title { |
|
|
margin-bottom: 1rem; |
|
|
font-weight: 600; |
|
|
color: #333; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
} |
|
|
.section-title i { |
|
|
margin-right: 0.5rem; |
|
|
color: #4f8cff; |
|
|
} |
|
|
.footer { |
|
|
margin-top: auto; |
|
|
background: #f8fafc; |
|
|
color: #6c757d; |
|
|
text-align: center; |
|
|
padding: 1rem 0 0.5rem 0; |
|
|
font-size: 0.95rem; |
|
|
} |
|
|
#updatedSense { |
|
|
display: none; |
|
|
} |
|
|
.toast-container { |
|
|
position: fixed; |
|
|
top: 20px; |
|
|
right: 20px; |
|
|
z-index: 1050; |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
|
|
|
<nav class="navbar navbar-expand-lg navbar-light bg-white mb-4"> |
|
|
<div class="container"> |
|
|
<a class="navbar-brand fw-bold" href="/"> |
|
|
<i class="fa-solid fa-brain me-2"></i>WSD Tool |
|
|
</a> |
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"> |
|
|
<span class="navbar-toggler-icon"></span> |
|
|
</button> |
|
|
<div class="collapse navbar-collapse" id="navbarNav"> |
|
|
<ul class="navbar-nav ms-auto align-items-center"> |
|
|
<li class="nav-item"> |
|
|
<a class="nav-link" href="{{ url_for('lesk_explained') }}"> |
|
|
<i class="fa-solid fa-book-open me-1"></i>Learn about Lesk Algorithm |
|
|
</a> |
|
|
</li> |
|
|
<li class="nav-item"> |
|
|
<a href="{{ url_for('index') }}" class="btn btn-outline-primary ms-2"> |
|
|
<i class="fa-solid fa-arrow-left me-1"></i>Back to Input |
|
|
</a> |
|
|
</li> |
|
|
</ul> |
|
|
</div> |
|
|
</div> |
|
|
</nav> |
|
|
|
|
|
<div class="container main-container"> |
|
|
|
|
|
<div class="text-card"> |
|
|
<h5 class="section-title"><i class="fa-solid fa-quote-left"></i>Original Text</h5> |
|
|
<div class="p-3 bg-light rounded"> |
|
|
{{ highlighted_text|safe }} |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
{% if target_word %} |
|
|
|
|
|
<div class="text-card"> |
|
|
<h5 class="section-title"><i class="fa-solid fa-magnifying-glass"></i>Context Information</h5> |
|
|
<div class="row"> |
|
|
<div class="col-md-6 mb-3"> |
|
|
<div class="fw-semibold mb-2">Target Word:</div> |
|
|
<div class="d-inline-block px-3 py-1 bg-light rounded-pill"> |
|
|
<i class="fa-solid fa-crosshairs me-1"></i>{{ target_word }} |
|
|
</div> |
|
|
</div> |
|
|
<div class="col-md-6 mb-3"> |
|
|
<div class="fw-semibold mb-2">Sentence:</div> |
|
|
<div class="p-2 bg-light rounded">{{ sentence }}</div> |
|
|
</div> |
|
|
<div class="col-12"> |
|
|
<div class="fw-semibold mb-2">Context Words:</div> |
|
|
<div> |
|
|
{% for word in context_words.split(', ') %} |
|
|
<span class="badge context-badge">{{ word }}</span> |
|
|
{% endfor %} |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
{% if best_sense %} |
|
|
<div class="text-card best-sense-card"> |
|
|
<h5 class="section-title"><i class="fa-solid fa-check-circle text-success"></i>Best Sense</h5> |
|
|
<div class="row align-items-center"> |
|
|
<div class="col-md-2 text-center d-none d-md-block"> |
|
|
<div class="sense-icon"> |
|
|
{% if 'animal' in best_sense.lexname() %} |
|
|
<i class="fa-solid fa-paw"></i> |
|
|
{% elif 'artifact' in best_sense.lexname() %} |
|
|
<i class="fa-solid fa-hammer"></i> |
|
|
{% elif 'time' in best_sense.lexname() %} |
|
|
<i class="fa-solid fa-clock"></i> |
|
|
{% elif 'object' in best_sense.lexname() %} |
|
|
<i class="fa-solid fa-mountain"></i> |
|
|
{% elif 'person' in best_sense.lexname() %} |
|
|
<i class="fa-solid fa-user"></i> |
|
|
{% elif 'plant' in best_sense.lexname() %} |
|
|
<i class="fa-solid fa-seedling"></i> |
|
|
{% elif 'attribute' in best_sense.lexname() %} |
|
|
<i class="fa-solid fa-sliders"></i> |
|
|
{% elif 'food' in best_sense.lexname() %} |
|
|
<i class="fa-solid fa-utensils"></i> |
|
|
{% else %} |
|
|
<i class="fa-solid fa-lightbulb"></i> |
|
|
{% endif %} |
|
|
</div> |
|
|
</div> |
|
|
<div class="col-md-10"> |
|
|
<h5 class="mb-3">{{ best_sense.definition() }}</h5> |
|
|
<div class="d-flex flex-wrap align-items-center mb-3"> |
|
|
<span class="badge lexname-badge me-2">{{ best_sense.lexname() }}</span> |
|
|
<span class="text-muted small">{{ best_sense.name() }}</span> |
|
|
</div> |
|
|
|
|
|
{% if best_sense.examples() %} |
|
|
<div class="mb-3"> |
|
|
<div class="fw-semibold">Examples:</div> |
|
|
<ul class="mb-0"> |
|
|
{% for example in best_sense.examples() %} |
|
|
<li>"{{ example }}"</li> |
|
|
{% endfor %} |
|
|
</ul> |
|
|
</div> |
|
|
{% endif %} |
|
|
|
|
|
<div class="algorithm-info"> |
|
|
<i class="fa-solid fa-robot me-1"></i> |
|
|
Selected using Enhanced Lesk algorithm with BERT embeddings |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
{% endif %} |
|
|
|
|
|
|
|
|
<div class="text-card best-sense-card" id="updatedSense"> |
|
|
<h5 class="section-title"><i class="fa-solid fa-check-circle text-success"></i>Updated Sense (Based on Feedback)</h5> |
|
|
<div class="row"> |
|
|
<div class="col-12"> |
|
|
<h5 id="updatedDefinition" class="mb-3"></h5> |
|
|
<div class="mb-3"> |
|
|
<div class="fw-semibold">Examples:</div> |
|
|
<ul id="updatedExamples"></ul> |
|
|
</div> |
|
|
<div class="algorithm-info"> |
|
|
<i class="fa-solid fa-thumbs-up me-1"></i> |
|
|
Your feedback has been recorded and will improve future disambiguations. |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="text-card"> |
|
|
<h5 class="section-title"><i class="fa-solid fa-layer-group"></i>Alternative Senses</h5> |
|
|
<div class="row"> |
|
|
{% for sense in top_senses %} |
|
|
<div class="col-md-4 mb-3"> |
|
|
<div class="card sense-card h-100"> |
|
|
<div class="card-body"> |
|
|
<p class="fw-semibold mb-2">{{ sense.definition() }}</p> |
|
|
<p class="text-muted small mb-2">Category: <span class="badge lexname-badge">{{ sense.lexname() }}</span></p> |
|
|
{% if sense.examples() %} |
|
|
<p class="small mb-3">"{{ sense.examples()[0] }}"</p> |
|
|
{% endif %} |
|
|
<button class="btn btn-sm feedback-btn w-100 feedback-btn" |
|
|
data-sense="{{ sense.name() }}"> |
|
|
<i class="fa-solid fa-check me-1"></i>This is correct |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
{% endfor %} |
|
|
</div> |
|
|
</div> |
|
|
{% else %} |
|
|
<div class="text-card"> |
|
|
<div class="alert alert-warning mb-0"> |
|
|
<i class="fa-solid fa-exclamation-triangle me-2"></i> |
|
|
No ambiguous words detected in the text. |
|
|
</div> |
|
|
</div> |
|
|
{% endif %} |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="toast-container"> |
|
|
<div class="toast align-items-center text-white bg-success border-0" role="alert" aria-live="assertive" aria-atomic="true" id="feedbackToast"> |
|
|
<div class="d-flex"> |
|
|
<div class="toast-body"> |
|
|
<i class="fa-solid fa-check-circle me-2"></i> |
|
|
Feedback recorded successfully! |
|
|
</div> |
|
|
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<footer class="footer"> |
|
|
<div>Made with <i class="fa-solid fa-heart text-danger"></i> by <a href="https://github.com/Gunjankumar55" target="_blank">Gunjankumar Choudhari</a> | <a href="{{ url_for('lesk_explained') }}">How it works</a></div> |
|
|
<div class="mt-1">© 2024 WSD Tool. All rights reserved.</div> |
|
|
</footer> |
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> |
|
|
<script> |
|
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
const feedbackBtns = document.querySelectorAll('.feedback-btn'); |
|
|
const feedbackToast = new bootstrap.Toast(document.getElementById('feedbackToast')); |
|
|
|
|
|
feedbackBtns.forEach(btn => { |
|
|
btn.addEventListener('click', function() { |
|
|
const sense = this.getAttribute('data-sense'); |
|
|
|
|
|
fetch('/feedback', { |
|
|
method: 'POST', |
|
|
headers: { |
|
|
'Content-Type': 'application/json', |
|
|
}, |
|
|
body: JSON.stringify({ |
|
|
word: '{{ target_word }}', |
|
|
context: '{{ context_words }}'.split(', '), |
|
|
correct_sense: sense |
|
|
}) |
|
|
}) |
|
|
.then(response => response.json()) |
|
|
.then(data => { |
|
|
if (data.definition) { |
|
|
document.getElementById('updatedDefinition').textContent = data.definition; |
|
|
|
|
|
const examplesList = document.getElementById('updatedExamples'); |
|
|
examplesList.innerHTML = ''; |
|
|
|
|
|
if (data.examples && data.examples.length > 0) { |
|
|
data.examples.forEach(example => { |
|
|
const li = document.createElement('li'); |
|
|
li.textContent = example; |
|
|
examplesList.appendChild(li); |
|
|
}); |
|
|
} |
|
|
|
|
|
document.getElementById('updatedSense').style.display = 'block'; |
|
|
|
|
|
|
|
|
feedbackToast.show(); |
|
|
|
|
|
|
|
|
document.getElementById('updatedSense').scrollIntoView({ behavior: 'smooth' }); |
|
|
} |
|
|
}) |
|
|
.catch(error => { |
|
|
console.error('Error:', error); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
</script> |
|
|
</body> |
|
|
</html> |
|
|
|