Оценивать несколько ответов от разных пользователей

Я хочу оценивать / оценивать ответы различных пользователей. Для этого я использовал 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. Когда пользователь вводит один и тот же ответ другим способом, как я упоминал выше, я получаю разные оценки. Я хочу, чтобы результаты были точными. Как я могу это сделать.

Вы не упомянули много важных моментов, и людям может быть не интересно читать ваш код. Пожалуйста, укажите, с какими функциями вы работаете, и объясните, что означает вывод, вместо того, чтобы говорить «Я получаю вывод как». Измените свой вопрос, чтобы помочь другим пользователям.

Aditya 31.10.2018 13:27

Я обновил вопрос. Я создаю модель вопросов для интервью на javascript, используя этот алгоритм. Я не упомянул данные обучения в предыдущем вопросе. Я рассказал о преимуществах JS (несколько ответов) в training_data.append .

Vijaya 31.10.2018 14:01

Я все еще пытаюсь понять, почему оценки для двух вводных предложений должны быть одинаковыми? Возможно, второе предложение соответствует меньшему количеству слов в ваших тренировочных данных (кстати, это неправильный термин здесь). По-прежнему слишком много кода, слишком мало объяснений.

Aditya 31.10.2018 14:05

ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, прочтите это перед тем, как задать вопрос о переполнении стека: stackoverflow.com/help/mcve .. Люди тратят личное / рабочее время, чтобы помочь найти ответ на ваш вопрос. Почему вы хотите увеличить их задачу?

Aditya 31.10.2018 14:06

Вы пытаетесь решить вопрос на собеседовании или строите справочный ответ?

Dimosthenis 31.10.2018 19:56
2
5
63
2

Ответы 2

Полиномиальный наивный байесовский метод дает разные оценки для разных входных данных. На самом деле это верно для любого алгоритма классификации.

Единственный способ получить одинаковую оценку для двух разных предложений - это чтобы предложения содержали одни и те же слова (в разном порядке или с разной частотой).

Подробнее см. определение алгоритма.

Полиномиальный Наивный Байес сравнивает вхождения слов. Он не принимает во внимание порядок, поскольку рассматривает каждую функцию как независимую от других. Таким образом, семантическое сходство (разные предложения, одно и то же значение) не всегда легко решить с помощью Наивного Байеса.

Если в вашем случае семантическое сходство имеет прямую корреляцию с присутствующими словами (в той степени, в которой этот порядок можно игнорировать), вы можете попробовать следующее:

  1. Поиграйте с данными. Посмотрите, какие результаты приносят такие усилия, как удаление игнорируемых слов или использование таких методов, как выход TF-IDF.
  2. Посмотрите, дает ли Word2Vec (или Doc2Vec) лучшие результаты
  3. Используйте больше данных для обучения

Это очень ленивые предложения, которые я могу дать, даже не зная, как выглядят ваши данные.

Другие вопросы по теме