Привет, я, Анирудха Пратап, в настоящее время изучаю 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/) за его руководство и поддержку.