Привет, я, Анирудха Пратап, в настоящее время изучаю Btech (ECE). Из IIIT Ная Райпур, я начинающий энтузиаст машинного обучения. Это мой первый блог, надеюсь, вам он понравится.

Этот блог связан с практической реализацией скрытой марковской модели, и он был сделан с учетом того, что читающий человек просто знаком с основами Python и скрытой марковской моделью. Если не прочтите этот замечательный блог

Ссылка- https://towardsdatascience.com/markov-chains-and-hmms-ceaf2c854788

В этом руководстве рассматривается вся базовая и теоретическая часть.

Цепи Маркова можно использовать для определения языка последовательности! В самом деле, чтобы найти наиболее «вероятный» язык, все, что нам нужно сделать, - это умножить вероятности перехода для данной последовательности и определить наивысший результат.

Приступим:

Вы можете скачать файлы и код по этой ссылке: -

Https://drive.google.com/drive/folders/1HcYTQbGbDB6KyoVD-OiaGe37g_Xvvprh?usp=sharing

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

import numpy as np
english = np.loadtxt('english.txt')
french = np.loadtxt('french.txt')
print(english.shape)
print(french.shape)

Матрицы имеют размер 28 * 28. Почему 28?

  • Первое состояние - это начальное состояние, с которого мы начинаем, а не буква
  • 26 следующих состояний соответствуют данной букве
  • Конечное состояние соответствует концу слова

Следовательно, вероятности в первой строке соответствуют вероятности перехода от начала слова к следующей букве.

Вот частичная схема цепи Маркова, в которой я представил некоторые из связей:

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

  • конец предложения будет обозначен .
  • конец слова больше не должен быть поглощающим состоянием и должен либо отправляться в конец предложения, скажем, с вероятностью 20%, либо возвращаться в начало предложения с вероятностью 80%.

Мы должны изменить функцию перехода в соответствии с правилами, определенными выше. Нам нужно добавить новую строку и новый столбец, чтобы матрица теперь имела размер 29 * 29.

def modify_mat_dic(english) :
# Append new column
    new_col = (np.zeros(28)).T
    english = np.vstack( (english, new_col) )
# Append new line
    new_line = np.zeros(29).reshape(-1,1)
    english= np.hstack( (english, new_line) )
    
    # Value on bottom right corner is now 1
    english[-1,-1] = 1
# Modify before last line (end of word)
    english[-2] = np.zeros(29)   
    english[-2,0] = 0.8 # Back to start
    english[-2,-1] = 0.2 # End of sentence
return english
    
bi_eng_mod = modify_mat_dic(english)
bi_fr_mod = modify_mat_dic(french)

Теперь мы определяем словарь с соответствием между индексом и буквой:

dic1 ={1 : '+', 
    2 : 'a', 
    3 : 'b', 
    4: 'c', 
    5 : 'd', 
    6 : 'e', 
    7: 'f', 
    8 : 'g', 
    9 : 'h', 
    10: 'i', 
    11: 'j', 
    12 : 'k', 
    13 : 'l', 
    14: 'm', 
    15 : 'n', 
    16 : 'o', 
    17: 'p', 
    18 : 'q', 
    19 : 'r' , 
    20: 's', 
    21 : 't', 
    22 : 'u', 
    23: 'v', 
    24 : 'w', 
    25 : 'x' , 
    26: 'y', 
    27 : 'z', 
    28 : '-',
    29 : '.'}

Давайте теперь вычислим вероятность последовательности для каждого языка:

def check(dict1, english, french, seq) :
    # The first letter has index 0
    key_0 = 0
    
    # Initialize transition probability to 1
    trans_eng = 1
    trans_fra = 1
    # For each letter of the sequence
    for letter in seq :
        # Find the key of the dictionary corresponding
        key_1 = [key for key, val in dict1.items() if val == letter][0] - 1
        
        # Transition probability is the value from key_0 to key_1 in Transition matrix
        trans_eng = trans_eng * english[key_0, key_1]
        trans_fra = trans_fra * french[key_0, key_1]
        # Update the value of the starting state 
        key_0 = [key for key, val in dict1.items() if val == letter][0] - 1
    if trans_eng > trans_fra :
        print("It's English !")
    else :
        print("It's French !")  
    return trans_eng, trans_fra
def generate(word):
    r=word.split(" ")
    w="-+".join(r)
    w=w+'-.'
    return w

Теперь мы можем попробовать нашу модель: -

seq=generate("entre ou ne pas etre")
print(check(dict1, bi_eng_mod, bi_fr_mod, seq))

Это французский!
(1.8310195094264342e-24, 4.726898418725102e-20)

seq=generate("hi there is")
print(check(dict1, bi_eng_mod, bi_fr_mod, seq))

Это английский!
(3.595339177081921e-11, 1.6459389950700984e-17)

Заключение: я выполнил базовую реализацию распознавания языков с помощью HMM. Надеюсь, эта быстрая реализация распознавания языков с использованием цепей Маркова была полезной.

Справка:



Примечание: - Я лично хочу поблагодарить Маэля Фабиана (https://github.com/maelfabien/) за его руководство и поддержку.