ambiguity-detection / detector.py
hasanriaz121
ambiguity detection added
98eb826
import nltk
from nltk.tokenize import word_tokenize
from sentence_transformers import SentenceTransformer, util
import numpy
# from nltk.stem import WordNetLemmatizer
import pickle
import re
nltk.download('punkt')
lexical_AMB = ['bound', 'break', 'content', 'call', 'continue', 'contract', 'count', 'direct', 'even', 'express', 'form', 'forward', 'function', 'job',
'level', 'name', 'notice', 'number', 'out', 'position', 'record', 'reference', 'subject', 'string', 'switch', 'throw', 'translate', 'try', 'under']
referential_AMB = ['everyone', 'everything', 'someone',
'something', 'anything', 'anyone', 'itself', 'yourself']
coordination_AMB = ['also', 'if then', 'unless', 'if and only if']
scope_AMB = ['all', 'any', 'few', 'little', 'many', 'much', 'several', 'some']
vague_AMB = ['good', 'better', 'worse', 'available', 'common', 'capability', 'easy', 'full', 'maximum',
'minimum', 'quickly', 'random', 'recently', 'sufficient', 'sufficiently', 'simple', 'useful', 'various']
stopwords_custom = ['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've", "you'll", "you'd", 'your', 'yours', 'yourselves',
'he', 'him', 'his', 'himself', 'she', "she's", 'her', 'hers', 'herself', 'it', "it's", 'its', 'they',
'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', "that'll", 'these',
'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does',
'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by',
'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below',
'to', 'from', 'up', 'down', 'in', 'on', 'off', 'over', 'again', 'further', 'then', 'once', 'here', 'there', 'when',
'where', 'why', 'how', 'both', 'each', 'more', 'most', 'other', 'such', 'no', 'nor', 'not', 'only', 'own', 'same',
'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', "don't", 'should', "should've", 'now', 'd', 'll',
'm', 'o', 're', 've', 'y', 'ain', 'aren', "aren't", 'couldn', "couldn't", 'didn', "didn't", 'doesn', "doesn't", 'hadn',
"hadn't", 'hasn', "hasn't", 'haven', "haven't", 'isn', "isn't", 'ma', 'mightn', "mightn't", 'mustn', "mustn't", 'needn',
"needn't", 'shan', "shan't", 'shouldn', "shouldn't", 'wasn', "wasn't", 'weren', "weren't", 'won', "won't", 'wouldn', "wouldn't"]
punctuation = ['.', ',', ';', '?']
# model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
lexical_encoded = pickle.load(open("lexical_encoded.pickel", "rb"))
vague_encoded = pickle.load(open("vague_encoded.pickel", "rb"))
referential_encoded = pickle.load(open("referential_encoded.pickel", "rb"))
coordination_encoded = pickle.load(open("coordination_encoded.pickel", "rb"))
scope_encoded = pickle.load(open("scope_encoded.pickel", "rb"))
class AmbguityDetector:
def __init__(self):
self.model = SentenceTransformer(
'sentence-transformers/all-MiniLM-L6-v2')
def sentence_ambiguity(self, sentence):
model = self.model
tokens = word_tokenize(sentence)
filtered_tokens = list()
for token in tokens:
if token not in stopwords_custom:
filtered_tokens.append(token)
for i in filtered_tokens:
filtered_tokens[filtered_tokens.index(i)] = i.lower()
if i in punctuation:
filtered_tokens.remove(i)
lexical = dict()
scope = dict()
referential = dict()
vague = dict()
coordination = dict()
ambiguity = dict()
ambiguous_words = list()
words_set=list()
for i in filtered_tokens:
temp = model.encode(i, convert_to_tensor=True)
for j in lexical_AMB:
temp2 = lexical_encoded[j]
cos_sim = util.pytorch_cos_sim(
temp, temp2).numpy().reshape([1, ])
if(cos_sim[0] >= 0.6):
ambiguous_words.append(i)
words_set.append((i,"lexical"))
lexical[i+"+"+j] = cos_sim[0]
for j in scope_AMB:
temp2 = scope_encoded[j]
cos_sim = util.pytorch_cos_sim(
temp, temp2).numpy().reshape([1, ])
if(cos_sim[0] >= 0.6):
ambiguous_words.append(i)
words_set.append((i,"scope"))
scope[i+"+"+j] = cos_sim[0]
for j in referential_AMB:
temp2 = referential_encoded[j]
cos_sim = util.pytorch_cos_sim(
temp, temp2).numpy().reshape([1, ])
if(cos_sim[0] >= 0.6):
ambiguous_words.append(i)
words_set.append((i,"referential"))
referential[i+"+"+j] = cos_sim[0]
for j in vague_AMB:
temp2 = vague_encoded[j]
cos_sim = util.pytorch_cos_sim(
temp, temp2).numpy().reshape([1, ])
if(cos_sim[0] >= 0.6):
ambiguous_words.append(i)
words_set.append((i,"vague"))
vague[i+"+"+j] = cos_sim[0]
for j in coordination_AMB:
temp2 = coordination_encoded[j]
cos_sim = util.pytorch_cos_sim(
temp, temp2).numpy().reshape([1, ])
if(cos_sim[0] >= 0.6):
ambiguous_words.append(i)
words_set.append((i,"coordination"))
coordination[i+"+"+j] = cos_sim[0]
ambiguous_words = list(dict.fromkeys(ambiguous_words))
ambiguity["lexical"] = lexical
ambiguity["referential"] = referential
ambiguity["scope"] = scope
ambiguity["vague"] = vague
ambiguity["coordination"] = coordination
ambiguity["words"] = ambiguous_words
ambiguity["lexical_st"]=words_set
# print(filtered_tokens)
# print(ambiguity)
return ambiguity["lexical_st"]