>  기사  >  기술 주변기기  >  Markov 체인을 사용하여 텍스트 생성기 구축

Markov 체인을 사용하여 텍스트 생성기 구축

WBOY
WBOY앞으로
2023-04-09 22:11:221202검색

이 기사에서는 인기 있는 기계 학습 프로젝트인 텍스트 생성기를 소개합니다. 텍스트 생성기를 구축하는 방법과 더 빠른 예측 모델을 달성하기 위해 Markov 체인을 구현하는 방법을 배우게 됩니다.

Markov 체인을 사용하여 텍스트 생성기 구축

텍스트 생성기 소개

텍스트 생성은 다양한 산업, 특히 모바일, 앱 및 데이터 과학에서 널리 사용됩니다. 언론에서도 글쓰기 과정을 돕기 위해 텍스트 생성을 사용합니다.

일상생활에서 우리는 텍스트 완성, 검색 제안, 스마트 작성, 챗봇 등을 모두 접하게 됩니다.

이 기사에서는 Markov 체인을 사용하여 텍스트 생성기를 구축합니다. 이는 체인의 이전 문자를 가져와서 시퀀스의 다음 문자를 생성하는 문자 기반 모델입니다.

샘플 단어를 사용하여 프로그램을 훈련함으로써 텍스트 생성기는 일반적인 문자 순서 패턴을 학습합니다. 그런 다음 텍스트 생성기는 이러한 패턴을 불완전한 단어인 입력에 적용하고 단어를 완성할 확률이 가장 높은 문자를 출력합니다.

Markov 체인을 사용하여 텍스트 생성기 구축

텍스트 생성은 이전에 관찰한 언어 패턴을 기반으로 다음 문자를 예측하고 생성하는 자연어 처리의 한 분야입니다.

머신러닝 이전에 NLP는 영어의 모든 단어가 포함된 테이블을 생성하고 전달된 문자열을 기존 단어와 일치시키는 방식으로 텍스트 생성을 수행했습니다. 이 접근 방식에는 두 가지 문제가 있습니다.

  • 수천 개의 단어를 검색하는 것은 매우 느릴 것입니다.
  • 생성기는 이전에 본 단어만 완성할 수 있습니다.

머신러닝과 딥러닝의 등장으로 NLP를 사용하면 실행 시간을 대폭 줄이고 일반성을 높일 수 있습니다. 생성기가 이전에 접하지 못한 단어를 완성할 수 있기 때문입니다. 원하는 경우 NLP를 확장하여 단어, 구문 또는 문장을 예측할 수 있습니다.

이 프로젝트에서는 Markov 체인만 사용하여 수행할 것입니다. Markov 프로세스는 서면 언어 및 복잡한 분포의 샘플 시뮬레이션과 관련된 많은 자연어 처리 프로젝트의 기초입니다.

Markov 프로세스는 매우 강력하여 샘플 문서만으로도 실제처럼 보이는 텍스트를 생성하는 데 사용할 수 있습니다.

마르코프 체인이란 무엇인가요?

마르코프 체인은 각 이벤트의 확률이 이전 이벤트의 상태에 따라 달라지는 일련의 이벤트를 모델링하는 확률론적 프로세스입니다. 모델에는 유한한 상태 집합이 있으며 한 상태에서 다른 상태로 이동할 조건부 확률은 고정되어 있습니다.

각 전환의 확률은 이벤트의 전체 기록이 아닌 모델의 이전 상태에만 의존합니다.

예를 들어 날씨를 예측하기 위해 Markov 체인 모델을 구축한다고 가정해 보겠습니다.

이 모델에는 맑은 날씨와 비가 내리는 두 가지 상태가 있습니다. 오늘 날씨가 맑다면 내일도 날씨가 맑을 확률이 더 높습니다(70%). 비가 내리는 경우에도 마찬가지입니다. 이미 비가 내린 경우에는 계속해서 비가 내릴 가능성이 높습니다.

하지만 날씨가 상태를 바꿀 가능성(30%)이 있으므로 이를 Markov 체인 모델에도 포함합니다.

Markov 체인을 사용하여 텍스트 생성기 구축

Markov 체인은 텍스트 생성기에 완벽한 모델입니다. 모델이 이전 문자만 사용하여 다음 문자를 예측하기 때문입니다. Markov 체인을 사용하면 정확하고 메모리가 적으며(이전 상태 1개만 저장) 실행 속도가 빠르다는 장점이 있습니다.

텍스트 생성 구현

여기에서는 6단계로 텍스트 생성기를 완성합니다.

  1. 조회 테이블 생성: 단어 빈도를 기록하는 테이블 만들기
  2. 빈도를 확률로 변환: 결과를 사용 가능한 형식으로 변환
  3. 로드 데이터 세트: 훈련 세트 로드 및 활용
  4. 마르코프 체인 구축: 확률을 사용하여 각 단어 및 문자에 대한 체인 생성
  5. 데이터 샘플링: 말뭉치의 다양한 부분을 샘플링하는 함수 생성
  6. 텍스트 생성: 모델 테스트

Markov 체인을 사용하여 텍스트 생성기 구축

1. 조회 테이블 생성

먼저 훈련 코퍼스에서 각 캐릭터 상태의 발생을 기록하는 테이블을 생성합니다. 훈련 코퍼스의 마지막 'K' 문자와 'K+1' 문자를 저장하고 조회 테이블에 저장합니다.

예를 들어, 훈련 코퍼스에 "그 남자는, 그들, 그때, the, the"가 포함되어 있다고 상상해 보세요. 그런 다음 단어 발생 횟수는 다음과 같습니다.

  • "the" — 3
  • "then" — 1
  • "they" — 1
  • "man" — 1

다음은 조회 결과입니다. 테이블:

Markov 체인을 사용하여 텍스트 생성기 구축

위의 예에서는 K = 3을 사용합니다. 이는 한 번에 3개의 문자가 고려되고 다음 문자(K+1)가 출력 문자로 사용된다는 의미입니다. 위 조회 테이블에서 단어(X)를 문자로 처리하고 첫 번째 the 뒤에 단어가 없으므로 출력 문자(Y)를 단일 공백(" ")으로 처리합니다. 또한 이 시퀀스가 ​​데이터 세트에 나타나는 횟수(이 경우 3회)도 계산됩니다.

이런 방식으로 말뭉치의 각 단어에 대한 데이터가 생성됩니다. 즉, 가능한 모든 X 및 Y 쌍이 생성됩니다.

코드에서 조회 테이블을 생성하는 방법은 다음과 같습니다.

 def generateTable(data,k=4):
 
 T = {}
for i in range(len(data)-k):
X = data[i:i+k]
Y = data[i+k]
#print("X %s and Y %s "%(X,Y))
if T.get(X) is None:
T[X] = {}
T[X][Y] = 1
else:
if T[X].get(Y) is None:
T[X][Y] = 1
else:
T[X][Y] += 1
return T
 T = generateTable("hello hello helli")
 print(T)
 
 #{'llo ': {'h': 2}, 'ello': {' ': 2}, 'o he': {'l': 2}, 'lo h': {'e': 2}, 'hell': {'i': 1, 'o': 2}, ' hel': {'l': 2}}

코드에 대한 간단한 설명:

3행에서는 X와 해당 Y 및 빈도 값을 저장하는 사전이 생성됩니다. 9~17행에서는 X와 Y의 발생을 확인합니다. 조회 사전에 이미 X와 Y 쌍이 있는 경우 1씩 늘리면 됩니다.

2. 빈도를 확률로 변환

이 테이블과 발생 횟수가 있으면 주어진 x 발생 후에 Y가 발생할 확률을 얻을 수 있습니다. 공식은 다음과 같습니다.

Markov 체인을 사용하여 텍스트 생성기 구축

예를 들어 X = the, Y = n인 경우 공식은 다음과 같습니다.

= 2/8= 0.125= 12.5%

일 때 Y = n의 빈도는 다음과 같습니다. 이 공식을 적용하여 조회 테이블을 마르코프 체인 사용 가능한 확률로 변환합니다:

 def convertFreqIntoProb(T):
for kx in T.keys():
s = float(sum(T[kx].values()))
for k in T[kx].keys():
T[kx][k] = T[kx][k]/s
 
return T
 
 T = convertFreqIntoProb(T)
 print(T)
 #{'llo ': {'h': 1.0}, 'ello': {' ': 1.0}, 'o he': {'l': 1.0}, 'lo h': {'e': 1.0}, 'hell': {'i': 0.3333333333333333, 'o': 0.6666666666666666}, ' hel': {'l': 1.0}}

간단한 설명:

특정 키의 빈도 값을 합산한 다음 이 키의 각 빈도 값을 이 추가된 값으로 나누어 다음을 얻습니다. 개연성.

3. 데이터 세트 로드

다음에는 실제 훈련 코퍼스가 로드됩니다. 원하는 긴 텍스트(.txt) 문서를 사용할 수 있습니다.

단순화를 위해 모델을 가르치기에 충분한 어휘를 제공하기 위해 정치적 연설을 사용하겠습니다.

 text_path = "train_corpus.txt"
 def load_text(filename):
with open(filename,encoding='utf8') as f:
return f.read().lower()
 
 text = load_text(text_path)
 print('Loaded the dataset.')

이 데이터 세트는 예시 프로젝트에 충분한 이벤트를 제공하여 합리적으로 정확한 예측을 할 수 있습니다. 모든 기계 학습과 마찬가지로 더 큰 훈련 코퍼스가 더 정확한 예측을 생성합니다.

4. 마르코프 체인 구축

마르코프 체인을 구축하고 확률을 각 문자와 연관시켜 보겠습니다. 여기에서는 1단계와 2단계에서 생성된 generateTable() 및 ConvertFreqIntoProb() 함수를 사용하여 Markov 모델을 구축합니다.

 def MarkovChain(text,k=4):
T = generateTable(text,k)
T = convertFreqIntoProb(T)
return T
 
 model = MarkovChain(text)

1번째 줄은 Markov 모델을 생성하는 방법을 생성합니다. 이 방법은 텍스트 코퍼스와 K 값을 허용합니다. K 값은 Markov 모델이 K 문자를 고려하고 다음 문자를 예측하도록 지시하는 값입니다. 2행에서는 이전 섹션에서 생성한 generateTable() 메서드에 텍스트 코퍼스와 K를 제공하여 조회 테이블을 생성합니다. 3행에서는 이전 강의에서 생성한 ConvertFreqIntoProb() 메서드를 사용하여 빈도를 확률 값으로 변환합니다.

5. 텍스트 샘플링

완료되지 않은 단어(ctx), 4단계의 마르코프 체인 모델(model), 단어의 기본을 구성하는 데 사용된 문자 수(k)를 사용하는 샘플링 함수를 만듭니다.

이 함수를 사용하여 전달된 컨텍스트를 샘플링하고 다음 가능한 문자를 반환하고 그것이 올바른 문자일 확률을 결정합니다.

 import numpy as np
 
 def sample_next(ctx,model,k):
 
ctx = ctx[-k:]
if model.get(ctx) is None:
return " "
possible_Chars = list(model[ctx].keys())
possible_values = list(model[ctx].values())
 
print(possible_Chars)
print(possible_values)
 
return np.random.choice(possible_Chars,p=possible_values)
 
 sample_next("commo",model,4)
 
 #['n']
 #[1.0]

코드 설명:

sample_next 함수는 ctx, model 및 k 값의 세 가지 매개변수를 허용합니다.

ctx는 새로운 텍스트를 생성하는 데 사용되는 텍스트입니다. 그러나 여기서는 ctx의 마지막 K 문자만 모델에서 시퀀스의 다음 문자를 예측하는 데 사용됩니다. 예를 들어, 공통 K = 4를 전달하고 모델이 다음 문자를 생성하는 데 사용하는 텍스트는 ommo입니다. 왜냐하면 Markov 모델은 이전 기록만 사용하기 때문입니다.

9행과 10행에는 가능한 문자와 그 확률 값이 인쇄됩니다. 이러한 문자는 우리 모델에도 존재하기 때문입니다. 다음 예측 문자는 확률 1.0으로 n이 됩니다. commo라는 단어는 다음 문자를 생성한 후에 더 일반적일 가능성이 높기 때문입니다.

라인 12에서는 위에서 논의한 확률 값을 기반으로 문자를 반환합니다.

6. 텍스트 생성

마지막으로 위의 모든 기능을 결합하여 일부 텍스트를 생성합니다.

def generateText(starting_sent,k=4,maxLen=1000):
 
 sentence = starting_sent
ctx = starting_sent[-k:]
 
for ix in range(maxLen):
next_prediction = sample_next(ctx,model,k)
sentence += next_prediction
ctx = sentence[-k:]
return sentence
 
 print("Function Created Successfully!")
 
 text = generateText("dear",k=4,maxLen=2000)
 print(text)

결과는 다음과 같습니다.

dear country brought new consciousness. i heartily great service of their lives, our country, many of tricoloring a color flag on their lives independence today.my devoted to be oppression of independence.these day the obc common many country, millions of oppression of massacrifice of indian whom everest.
 my dear country is not in the sevents went was demanding and nights by plowing in the message of the country is crossed, oppressed, women, to overcrowding for years of the south, it is like the ashok chakra of constitutional states crossed, deprived, oppressions of freedom, i bow my heart to proud of our country.my dear country, millions under to be a hundred years of the south, it is going their heroes.

위 함수는 생성된 텍스트의 시작 단어, K 값, 필수 텍스트의 최대 문자 길이 등 세 가지 매개 변수를 허용합니다. 코드를 실행하면 "dear"로 시작하는 2000자 텍스트가 생성됩니다.

이 연설은 그다지 의미가 없을 수도 있지만 단어는 완전하며 종종 단어의 친숙한 패턴을 모방합니다.

다음에 배울 내용

이것은 간단한 텍스트 생성 프로젝트입니다. 이 프로젝트는 딥 러닝 여정을 계속할 때 사용할 수 있는 자연어 처리 및 Markov 체인이 실제로 어떻게 작동하는지에 대한 이해를 제공합니다.

이 기사는 Markov 체인이 수행한 실험 프로젝트를 소개하기 위한 것입니다. 실제 응용 프로그램에서는 아무런 역할을 하지 않기 때문입니다. 더 나은 텍스트 생성 효과를 얻으려면 GPT-3와 같은 도구를 배우십시오.

위 내용은 Markov 체인을 사용하여 텍스트 생성기 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제