оценка нескольких ответов от разных пользователей - PullRequest
0 голосов
/ 31 октября 2018

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

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

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

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

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

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

0 голосов
/ 31 октября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...