Я хочу оценивать / оценивать ответы различных пользователей. Для этого я использовал Multinomial navie bayes
. Ниже мой код.
# use natural language toolkit
import nltk
from nltk.stem.lancaster import LancasterStemmer
import os
import json
import datetime
stemmer = LancasterStemmer()
# 3 classes of training data
training_data = []
# capture unique stemmed words in the training corpus
class_words = {}
corpus_words = {}
classes = list(set([a['class'] for a in training_data]))
for c in classes:
class_words[c] = []
for data in training_data:
# tokenize each sentence into words
for word in nltk.word_tokenize(data['sentence']):
# ignore a few things
if word not in ["?", "'s"]:
# stem and lowercase each word
stemmed_word = stemmer.stem(word.lower())
if stemmed_word not in corpus_words:
corpus_words[stemmed_word] = 1
else:
corpus_words[stemmed_word] += 1
class_words[data['class']].extend([stemmed_word])
# we now have each word and the number of occurances of the word in our training corpus (the word's commonality)
print ("Corpus words and counts: %s" % corpus_words)
# also we have all words in each class
print ("Class words: %s" % class_words)
sentence = "The biggest advantages to a JavaScript having a ability to support all modern browser and produce the same result."
def calculate_class_score(sentence, class_name):
score = 0
for word in nltk.word_tokenize(sentence):
if word in class_words[class_name]:
score += 1
return score
for c in class_words.keys():
print ("Class: %s Score: %s" % (c, calculate_class_score(sentence, c)))
# calculate a score for a given class taking into account word commonality
def calculate_class_score_commonality(sentence, class_name):
score = 0
for word in nltk.word_tokenize(sentence):
if word in class_words[class_name]:
score += (1 / corpus_words[word])
return score
# now we can find the class with the highest score
for c in class_words.keys():
print ("Class: %s Score: %s" % (c, calculate_class_score_commonality(sentence, c)))
def find_class(sentence):
high_class = None
high_score = 0
for c in class_words.keys():
score = calculate_class_score_commonality(sentence, c)
if score > high_score:
high_class = c
high_score = score
return high_class, high_score
Примечание: Я не добавил данных для обучения.
Когда я даю ввод как
find_class("the biggest advantages to a JavaScript having a ability to
support all modern browser and produce the same result.JavaScript
small bit of code you can test")
Я получаю результат как
('Advantages', 5.07037037037037)
Но когда я даю ввод как
find_class("JavaScript can be executed within the user's browser
without having to communicate with the server, saving on bandwidth")
Я получаю ответ / вывод как
('Advantages', 2.0454545)
Я создаю его для вопросов JavaScript Interview / viva. Когда пользователь вводит один и тот же ответ другим способом, как я упоминал выше, я получаю разные оценки. Я хочу, чтобы результаты были точными. Как я могу это сделать.
Я обновил вопрос. Я создаю модель вопросов для интервью на javascript, используя этот алгоритм. Я не упомянул данные обучения в предыдущем вопросе. Я рассказал о преимуществах JS (несколько ответов) в training_data.append
.
Я все еще пытаюсь понять, почему оценки для двух вводных предложений должны быть одинаковыми? Возможно, второе предложение соответствует меньшему количеству слов в ваших тренировочных данных (кстати, это неправильный термин здесь). По-прежнему слишком много кода, слишком мало объяснений.
ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, прочтите это перед тем, как задать вопрос о переполнении стека: stackoverflow.com/help/mcve .. Люди тратят личное / рабочее время, чтобы помочь найти ответ на ваш вопрос. Почему вы хотите увеличить их задачу?
Вы пытаетесь решить вопрос на собеседовании или строите справочный ответ?
Полиномиальный наивный байесовский метод дает разные оценки для разных входных данных. На самом деле это верно для любого алгоритма классификации.
Единственный способ получить одинаковую оценку для двух разных предложений - это чтобы предложения содержали одни и те же слова (в разном порядке или с разной частотой).
Подробнее см. определение алгоритма.
Полиномиальный Наивный Байес сравнивает вхождения слов. Он не принимает во внимание порядок, поскольку рассматривает каждую функцию как независимую от других. Таким образом, семантическое сходство (разные предложения, одно и то же значение) не всегда легко решить с помощью Наивного Байеса.
Если в вашем случае семантическое сходство имеет прямую корреляцию с присутствующими словами (в той степени, в которой этот порядок можно игнорировать), вы можете попробовать следующее:
Это очень ленивые предложения, которые я могу дать, даже не зная, как выглядят ваши данные.
Вы не упомянули много важных моментов, и людям может быть не интересно читать ваш код. Пожалуйста, укажите, с какими функциями вы работаете, и объясните, что означает вывод, вместо того, чтобы говорить «Я получаю вывод как». Измените свой вопрос, чтобы помочь другим пользователям.