Malazan Empire 구문 감지기 모델을 구축하는 방법



이제 나는 거창한 단어에 구애받지 않고 내 이해로 설명하는 것을 믿으며, 동료 초보자가 자신이 이해하는 방식으로 개념을 설명할 때 사람들(초보자)이 개념을 더 잘/빠르게 이해하는 경향이 있다는 것을 발견했습니다. 따라서 그것을 그의 수준으로 깨뜨립니다. 그러나 큰 기술적 정의를 위해 노력하는 사람들은 연구를 할 수 있으며 그들은 인터넷에 있습니다.

구문 감지기란?

구문 감지기는 가장 널리 사용되는 카운트 데이터 정렬(gensim에서 사용되는 기술)과 함께 여러 기술을 사용하는 구현된 알고리즘입니다. 이 기술은 미리 정의된 최소 빈도 또는 gensim에 따라 항상 함께 발생하는 일반적인 단어를 식별합니다. 임계값 점수, 여기서 임계값이 높을수록 선택 프로세스가 엄격해집니다.

이 모델은 텍스트에 있는 구(바이그램)를 식별하는 데 사용되며 특히 단어 벡터를 구축하는 데 유용합니다. 단어 벡터의 어휘 수를 줄임으로써 계산 복잡성을 상당히 줄이기 때문에 함께 자주 발생하는 단어를 단일 단어로 결합하여 이를 수행합니다.

import os
import re
from typing import List
from itertools import islice

from gensim import utils
from gensim.models.phrases import Phrases, ENGLISH_CONNECTOR_WORDS
from nltk.tokenize import NLTKWordTokenizer, PunktSentenceTokenizer
view rawmodel.py


이 모델은 Malazan Book of the Fallen의 전체 시리즈에서 학습됩니다. 모델을 학습하는 훌륭한 리소스일 뿐만 아니라 훨씬 더 훌륭한 읽기가 가능하거나 현재 귀하의 책에 있는 [또는 모든] 책이 될 수 있습니다. 컴퓨터. 책은 쉽게 로드할 수 있도록 .txt 형식[또는 변환]이어야 하며 더 이상 텍스트 파일을 포함하는 하위 폴더가 없는 Books라는 폴더에 모두 있어야 합니다.

class CustomPathLineSentences:
    """Custom implementaion of gensim.models.word2vec.PathLineSentences

    It differs from gensim implementation in that it replaces the default
    tokenizer with a more powerful tokenizer, while also adding more
    functionalities to it.

    Functionalities
    1) Break the block of text into sentences using PunktSentenceTokenizer()
       as each text is split on \n
    2) For each sentence
        a) Tokenize sentence using NLTKWordTokenizer()
            i) Clean each tokens 

        b) Join words that constitute phrases into a single word if a 
           phrase detector model is passed as argument

        c) yield up the preprocessed tokens for further processing
    2) 

    Parameters

    source: str
        File path of the folder containing the text file
    limit: int
        The maximum number of characters to read in each text block
    include_phrase: bool
        If True group words that constitue phrase into a single word, 
        this should only be set to True if a phrase detector model has
        been trained
    phrase_model: phrase detector model
        The model used in detecting phrases in text
        if include_phrase is True and phrase_model is None, a ValueError
        is raised,
    """
    def __init__(self, source, limit=None, 
                 include_phrase=False, phrase_model=None):
        self.source = source
        self.limit = limit
        self.include_phrase = include_phrase
        self.word_tokenizer = NLTKWordTokenizer()
        self.sentence_tokenizer = PunktSentenceTokenizer()

        if self.include_phrase and phrase_model is not None:
            self.phrase_model = phrase_model
        elif self.include_phrase and phrase_model is None:
            raise ValueError("phrase model detector not provided")

        if os.path.isfile(self.source):
            print('This is a file, use a folder next time')
            self.input_files = [self.source]
        elif os.path.isdir(self.source):
            self.source = os.path.join(self.source, '')
            self.input_files = os.listdir(self.source)
            self.input_files = [self.source + fname 
                                    for fname in self.input_files]
            self.input_files.sort()
        else:
            raise ValueError('input is neither a file or a directory')

    def __word_cleaner(self, word, cleaned_word_tokens, punctuation) -> List[str]:
        """For each word if any punctuation is still found in the 
        beginning and ending, further split them, ignore any 
        punctuation found in between the alphabet

        """
        beginning_punc = None
        ending_punc = None

        if len(word) > 1:
            if word[0] in punctuation:
                beginning_punc = word[0]
                word = word[1:]
            if word[-1] in punctuation:
                ending_punc = word[-1]
                word = word[:-1]

        if beginning_punc is not None:
            cleaned_word_tokens.append(beginning_punc)

        # For Some reason Jupyter notebook keep restarting
        # because of this recursive code

#         if word[0] in punctuation or word[-1] in punctuation:
#             cleaned_word_tokens = self.__word_cleaner(word, cleaned_word_tokens, 
#                                                       punctuation)
#         else:
#             cleaned_word_tokens.append(word)

        cleaned_word_tokens.append(word)
        if ending_punc is not None:
            cleaned_word_tokens.append(ending_punc)

        return cleaned_word_tokens

    def clean_token_words(self, sentence) -> List[str]:
        """Split a sentence into tokens for further preprocessing"""
        word_tokens: list = sentence.split()
        cleaned_word_tokens = []
        punctuation = string.punctuation + "’" + "‘"

        for word in word_tokens:
            if not self.include_phrase:
                cleaned_word_tokens.append(word.strip(punctuation))
            else:
                self.__word_cleaner(word, cleaned_word_tokens, punctuation)

        return cleaned_word_tokens          

    def __iter__(self):
        """Iterate through the files"""
        pattern = re.compile("[‘’]")

        total_count = 0

        for fname in self.input_files:
            with utils.open(fname, 'rb') as fin:
                # iterate through the text using the inbuilt
                # readline function
                for line in islice(fin, self.limit):
                    line = utils.to_unicode(line).strip()
                    if line:
                        # text broken at the line break point may contain
                        # many sentences in it, use a sentence segmenter
                        # to further break them into sentences
                        sentences = self.sentence_tokenizer.tokenize(line)

                        # for each of those sentences break them into tokens
                        for sentence in sentences:
                            sentence = pattern.sub("'", sentence)
                            word_tokens = self.clean_token_words(sentence)
                            if not self.include_phrase:
                                yield word_tokens
                            else:
                                # combine detected words that consitutes phrases
                                # into a single word
                                generator = self.phrase_model.analyze_sentence(word_tokens)
                                yield [word[0] for word in generator]
                    to

    def __len__(self):
        counts = 0
        for sentences in self.__iter__():
            counts += 1
        return counts


좋아요, 재미있었어요. 방금 편리한 도구를 만들어 도구 벨트에 추가했습니다. 여러 시나리오에서 유용할 것입니다[특히 단어 벡터 또는 스타일 추론 모델을 구축할 때]. 그래서 파이썬 텍스트 어딘가에 저장합니다. 파일을 만들고 파일 이름을 utils.py로 지정합니다.

I cheated a little, I built the CustomPathLineSentences function to be generic and have many use cases not specific to only this project, as you will see when I use it in building a and training a .



요약하면 이 클래스가 수행하는 것은 인스턴스화될 때 우리를 위한 반복자가 되고, 텍스트 파일을 반복하고 동시에 우리를 위해 전처리하므로 구문 탐지기 모델을 교육하는 더 어려운 작업을 우리에게 남겨둔다는 것입니다. 아래에서 할 것입니다.

# train a phrase detector
def train_phrase_detector(*, threshold=400, reduce_model_memory_size=False):
    sentences_iterator = CustomPathLineSentences('Books')
    print("List of iles that will be analyzed for word phrase (bigrams)")
    for file in sentences_iterator.input_files:
        print(file)

    phrases = Phrases(sentences_iterator, threshold=threshold, 
                     connector_words=ENGLISH_CONNECTOR_WORDS)

    print("Training completed")
    return (phrases.freeze(), sentences_iterator) if reduce_model_memory_size 
                else (phrases, sentences_iterator)


사전 설정 및 기본 매개변수를 사용하여 모델을 훈련하는 작업을 처리할 함수를 정의했습니다. 다음으로 함수를 실행하여 모델을 학습시킵니다.

threshold = 400
reduce_model_memory_size = False
phrase_model, sentences_iterator = train_phrase_detector(
               threshold=threshold,
                                 reduce_model_memory_size=reduce_model_memory_size)
# saving the trained model
fname = "malaz_phrase_detector"
phrase_model = phrase_model.save(fname)


모델 훈련을 마치고 단어 벡터와 스타일 추론 모델을 구축해야 할 때 추가로 사용할 수 있도록 디스크에 저장했습니다. 모델이 학습한 내용을 확인하고 텍스트에서 단어 구문을 감지할 수 있는지 테스트해 보겠습니다.

# print how many phrases the model detected in the trainng text
print(f"Total number of phrases (bigrams) detected: {len(phrase_model)}")
text = """The Foolish Dog Clan will join your companies on the other side,' Coltaine said. 'You and the Weasel Clan shall guard this side while the wounded and the refugees cross"""
# preprocess the text in the same way the training
# text was preprocessed
text_cleaned = sentences_iterator.clean_token_words(text)
# detect phrases (bigrams) in text
phrases_detected = phrase_model.analyze_sentence(text_cleaned)
print("Detected phrases")
for key, values in phrases_detected.items():
    if values > 0:
        print(key)


우리는 구문 감지기 모델을 성공적으로 구축했으며 이 모델은 텍스트에서 테스트되었으며 모델에서 구문을 성공적으로 감지할 수 있었습니다.

This is important, this model can be general enough to detects phrases that follows the pattern of the training text [for example, the next series of an author novel if the model has been trained on the previous series]. But if the model is made to detect phrases on a completely different pattern of text, that does not even contain the same vocabulary as the training text, the model will fail woefully.



하나님은 당신을 사랑합니다!

좋은 웹페이지 즐겨찾기