классификация текста с учителем с помощью мутиномиального нативного байесовского алгоритма

Модели классификации текста используются для разделения текста на организованные группы. Текст анализируется моделью, а затем в зависимости от содержимого применяются соответствующие теги. Модели машинного обучения, которые могут автоматически применять теги для классификации, известны как классификаторы.
Классификаторы не могут просто работать автоматически, их нужно обучить, чтобы они могли делать конкретные прогнозы для текстов. Обучение классификатора осуществляется:

  1. определение набора тегов, с которыми будет работать модель
  2. создание ассоциаций между фрагментами текста и соответствующим тегом или тегами
    После того, как будет помечено достаточное количество текстов, классификатор может извлечь уроки из этих ассоциаций и начать делать прогнозы с новыми текстами.

обучение с учителем в классификации текстов
Как мы знаем, данные в основном либо структурированы, либо неструктурированы, т.е. данные могут иметь метки или не иметь меток и могут быть только набором текстов. Когда у нас есть данные с метками, мы можем выполнять обучение с учителем. Контролируемая классификация текста в основном означает, что у вас есть набор примеров, где мы знаем правильные ответы. Поэтому, чтобы машина могла учиться так же, как мы, мы должны предоставить набор текста и его меток в качестве входных данных. Например, если у нас есть набор данных о фруктах и ​​овощах, таких как [‘apple’,’banana’,’mango’] относится к категории фруктов и [‘potato’, ‘cabbage’, ’radish’] относится к категории овощей. Теперь, когда у нас есть данные с их меткой, мы можем обучить машину этим данным. Затем машина пытается изучить его, как мы это делали, когда учились в школе, чтобы предсказать категорию новых данных, которые могут быть фруктами или овощами. Например, если я передам новые данные как «арбуз», машина должна вернуть свою метку как «фрукты». Надеюсь, это дало небольшое понимание классификации текста.

этап обучения с учителем в классификации текстов

ЧАСТЬ-I: Обучение

  1. Во время обучения экстрактор признаков используется для преобразования каждого входного значения в набор признаков.
  2. Эти наборы функций, которые фиксируют основную информацию о каждом входе, должны использоваться для его классификации.
  3. Пары наборов функций и меток вводятся в алгоритм машинного обучения для создания модели.

ЧАСТЬ-II: Прогноз

  1. Во время прогнозирования тот же экстрактор признаков используется для преобразования ненаблюдаемых входных данных в наборы признаков. Эти наборы функций затем передаются в модель, которая создает прогнозируемые метки.

полиномиальный нативный алгоритм Байеса

Общая идея Наивного Байеса:

  1. Представьте документ X как набор (w, частота w) пар.
  2. Для каждой метки y постройте вероятностную модель P(X| Y = y) документов класса y.
  3. Для классификации выберите метку y, которая с наибольшей вероятностью будет генерировать X:
    Finalmaxscore.png

Предположения:

  1. Порядок слов в документе X не имеет значения, но повторения слов имеют значение.
  2. Слова появляются независимо друг от друга, учитывая класс документа.
    На основе этих предположений у нас есть следующие уравнения для оценки P(X|y):

.png

Есть проблемы с этими уравнениями:
Для уравнения (1), если в нашем документе более 100 слов, P(w₁,…, w_n|Y = y) будет произведением очень маленьких вероятностей слов (<0,1), что приведет к проблеме НЕДОСТАТОЧНОГО ПЕРЕТОКА => Работа с логарифмы желательны для поддержания численной стабильности.

multinomial_loglikehood.png

Для уравнения (2), если у нас есть новое слово w в новом тексте, который нам нужно классифицировать, P (W = w | Y = y) = 0, поскольку w никогда не появлялось в наших обучающих данных. => одно из решений — сгладить вероятности. Предположим, у нас есть примеры с P(w|y) = p. Такое использование m и p является априором Дирихле для полиномиального распределения. Обратите внимание, что существует множество методов сглаживания.

мультиномиальный_likehood.png

Собрав все это вместе, мы имеем следующий алгоритм:
final_algorithm.png

Теперь давайте поработаем над гипотетическим примером, чтобы понять алгоритм:
Предположим, у нас есть 3 документа:
X₁ = «Закрытие правительства» с меткой y₁ = новости
X₂ = «Федеральные служащие протестуют против закрытия» с меткой y₂ = новости
X₃ = «Превратить меланхолию в похороны» с ярлыком y₃ = поэзия
и новый документ для классификации:
X_new = «Отключение влияет на льготы для федеральных служащих»
Затем мы можем получить эту таблицу подсчета из наших данных обучения.
word_table.png

Для простоты я не стал исключать стоп-слова, но на практике вы обязательно должны это сделать. Кроме того, чтобы предотвратить проблему потери значимости, я определяю параметры сглаживания: p = 0,5 и m = 1. Затем мы можем рассчитать оценку каждой метки для нового документа X_new следующим образом.

счет_пример.png

Мы видим, что оценка для ярлыка «новости» выше, чем оценка для ярлыка «поэзия», поэтому мы будем классифицировать X_new как «новости».

Пример полиномиального нативного байесовского алгоритма с библиотекой машинного обучения sapnil_machinelearning:
Чтобы подготовить набор данных, загрузите загруженные данные в кадр данных pandas, содержащий два столбца — текст и метку.

trainDF = load_cvs_dataset("../setup.csv")
txt_label = trainDF['category']
txt_text = trainDF['text']

этот сегмент кода находится в multinomial_example.py

def load_cvs_dataset(dataset_path):
    # Set Random seed
    np.random.seed(500)
    # Add the Data using pandas
    Corpus = pd.read_csv(dataset_path, encoding='latin-1', error_bad_lines=False)

    return Corpus

этот сегмент кода находится в dataset_load.py

Разработка текстовых функций:
Следующим шагом является этап проектирования функций. На этом этапе необработанные текстовые данные будут преобразованы в векторы объектов, а новые объекты будут созданы с использованием существующего набора данных. Мы будем реализовывать Count Vectors как функции, чтобы получить соответствующие функции из нашего набора данных.
Считайте векторы как функции:
Вектор счетчика — это матричное представление набора данных, в котором каждая строка представляет документ из корпуса, каждый столбец представляет термин из корпуса, а каждая ячейка представляет частоту встречаемости определенного термина в конкретном документе.

trainSet, testcopy, labelset, testlabelcopy=splitDataset(txt_text, txt_label,0.2)
model_input=count_word_fit(trainSet,labelset)

этот сегмент кода находится в multinomial_example.py

очистить текст из каждого текстового документа перед генерацией матрицы частот признаков


    tag_map = defaultdict(lambda : wn.NOUN)
    tag_map['J'] = wn.ADJ
    tag_map['V'] = wn.VERB
    tag_map['R'] = wn.ADV
    
   
    
    #Using Python's stop-words package to get the stop words in English
    
    stop_words = get_stop_words('english')
    for doc in doc_list:
        
        result_doc = re.sub(r'\d+', '', doc)
        
        words = word_tokenize(result_doc)
        
        
        low_tokens = [w.lower() for w in words]
      
        #REMOVE punctuation mark
        table = str.maketrans('', '', string.punctuation)
        pun_words = [w.translate(table) for w in low_tokens]
        emp_str_list = list(filter(None, pun_words)) 
        #REMOVE punctuation mark
        
        # Lemmatize list of words and join
        # Init the Wordnet Lemmatizer
        # Declaring Empty List to store the words that follow the rules for this step
        
        Final_words = []
        # Initializing WordNetLemmatizer()
        word_Lemmatized = WordNetLemmatizer()
        # pos_tag function below will provide the 'tag' i.e if the word is Noun(N) or Verb(V) or something else.
        for word, tag in pos_tag(emp_str_list):
        # Below condition is to check for Stop words and consider only alphabets
            if word not in stopwords.words('english') and word.isalpha():
                word_Final = word_Lemmatized.lemmatize(word,tag_map[tag[0]])
                Final_words.append(word_Final)
        
        #remove stop words
        stop_words = set(stopwords.words('english'))
        rvm_stop_words = [w for w in Final_words if not w in stop_words]
        #remove stop words

этот сегмент кода находится в count_word_fit.py

после очистки текста в каждом документе сгенерируйте частотную матрицу признака в каждом документе.

total_class_token={}
  
  #print(vocabulary)
  class_eachtoken_count={} 
  
  for class_label in class_labels: 
      total_class_token[class_label]=0
      class_eachtoken_count[class_label]={}
      for voc in vocabulary:
          class_eachtoken_count[class_label] [voc] = 0
         
  
  doccount=0
  total_voca_count=0
  for doc in doc_list:
      words = doc.split(" ");
     
      class_label=temp_class_labels[doccount]
    
      for word in words:
          if word in vocabulary:
              class_eachtoken_count[class_label]		  [word]=class_eachtoken_count[class_label][word]+1 
              total_class_token[class_label]=total_class_token[class_label]+1
              total_voca_count=total_voca_count+1
     
      
      doccount=doccount+1

этот сегмент кода находится в count_word_fit.py

полиномиальный нативный алгоритм Байеса

следующий сегмент кода представляет собой реализацию полиномиального собственного алгоритма Байеса

  score_Class = 0
     max_score = 0
     final_class_label=""
    
     vocabularyCount = model_data.get_vocabularyCount()
     total_class_token = model_data.get_total_class_token()
     for class_label in model_data.get_class_labels():
         score_Class = math.log(total_class_token[class_label] / vocabularyCount) + condProbabilityOfTermClass[class_label]
         # print('the score_Class ',score_Class)
         if(max_score > score_Class):
             max_score = score_Class
             final_class_label = class_label
             # print('the class label '+final_class_label)
     final_doc_class_label['doc' + '-' + str(doccount)] = final_class_label
     # print(final_doc_class_label['doc'+'-'+str(doccount)])
     doccount = doccount + 1 

этот сегмент кода находится в multinomial_nativebayes.py

оценка производительности алгоритма:

def accuracy_score(testlabelcopy, final_doc_class_label):
    label_count = 0
    wrong_count = 0
    for label in testlabelcopy:
        if label != final_doc_class_label['doc' + '-' + str(label_count)] :
            wrong_count = wrong_count + 1
    label_count = label_count + 1
    
    accuracy = ((len(testlabelcopy) - wrong_count) / len(testlabelcopy)) * 100
    
    return accuracy

этот сегмент кода находится в multinomial_nativebayes.py

ограничение полиномиального нативного байесовского алгоритма

  1. если каждый документ в тестовом наборе данных содержит очень мало известных слов в словарном наборе, это снижает уровень точности собственного байесовского алгоритма. Потому что апостериорное значение набора входных признаков для каждого класса одинаково, что возвращает неверный класс/категорию для каждого документа в тестовый набор данных. В результате уровень точности многономиального нативного байесовского алгоритма снизится.
  2. базовый подход BOW не учитывает значение слова в документе. Он полностью игнорирует контекст, в котором используется. Одно и то же слово может использоваться в нескольких местах в зависимости от контекста или близлежащих слов.
  3. Для большого документа размер вектора может быть огромным, что требует больших вычислений и времени. Возможно, вам придется игнорировать слова, исходя из их отношения к вашему варианту использования.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *