기본 Python만 사용하여 텍스트 사전 처리 및 전자 메일 분류

e-메일을 스팸 및 비 스팸으로 나눕니까?이것은 자연 언어로 처리된'안녕하세요, 세계'아닙니까?다른 개발자들이 다 하고 있지 않나요?
네, 그렇습니다.그러나 내장 라이브러리를 사용하지 않으면 처음부터 코드를 작성할까요?이 블로그는 내장된python 라이브러리를 사용했지만 그 배후의 내용을 확정하지 못한 사람들을 위해 쓴 것이다.전체 코드 찾기here.이 블로그를 읽으면 전체 파이프라인을 더욱 잘 이해할 수 있습니다.그럼 우리 그냥 뛰어들어가자!
이 문제의 기본 절차는-
  • 사전 처리 이메일
  • 이메일의 모든 고유한 단어 목록 찾기
  • 우편물 추출 특징 벡터
  • 소박 베일러 분류기 적용(내장 라이브러리 사용)
  • 시범을 보이기 위해서 나는 기본적인 데이터 집합을 만들었다.스팸메일은 긍정적인 라벨이 붙고, 다른 메일은 부정적인 라벨이 붙는다.
    먼저 e-메일을 읽고 목록에 저장합니다.다음은 csv 리더를 사용하여 이 점을 보여 줍니다.
    emails = []
    with open('emaildataset.csv', 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            emails.append((row[0].strip(), row[1].strip()))
    

    1. 예처리


    우리는 지금 예처리 단계에 들어갈 수 있다.이 전자메일들은 먼저 소문자로 변환된 다음에 기호화폐로 분할된다.그 다음에 우리는 표기에 세 가지 기본적인 예처리 과정을 적용한다. 그것이 바로 문장 삭제, 정지 단어 삭제와 어간 분석이다.이것들을 상세하게 토론합시다.
    구두점 삭제
    이 과정은 문자열의 모든 문장을 삭제하는 데 관련됩니다. 우리는python의 문자열 함수replace () 를 사용하여 완성합니다.다음 함수는 문자열을 입력으로 하고 빈 문자열로 바꾸며 문장부호가 없는 문자열을 되돌려줍니다.목록에 더 많은 문장을 추가할 수도 있고, 문장 정규 표현식을 사용할 수도 있습니다.
    def punctuation_removal(data_string):
        punctuations = [",", ".", "?", "!", "'", "+", "(", ")"]
        for punc in punctuations:
            data_string = data_string.replace(punc, "")
        return data_string
    
    스톱 워드 삭제
    이 과정은 모든 상용어를 삭제하는 것을 포함하는데, 이 단어들은 문장의 문법을 정확하게 하는 데 사용되며, 많은 의미를 증가시키지 않는다.다음에 제시된 함수는 영패 목록을 입력으로 하고 이를 분석하여 지정한 stopwords 목록에 있는지 확인하고 stopwords가 없는 영패 목록을 되돌려줍니다.목록에 더 많은 정지어를 추가할 수 있습니다.
    def stopword_removal(tokens):
      stopwords = ['of', 'on', 'i', 'am', 'this', 'is', 'a', 'was']
        filtered_tokens = []
        for token in tokens:
            if token not in stopwords:
                filtered_tokens.append(token)
        return filtered_tokens
    
    저지하다
    이 과정은 파이프를 예처리하는 마지막 단계다.여기서 우리는 기호화폐를 기본 형식으로 바꿀 것이다.'먹기','먹기','먹기'같은 단어는'먹기'로 바뀐다.이를 위해, 우리는python 사전의 도움말을 사용하여 키와 값을 기본 형식의 표기, 그리고 다른 형식의 단어 목록으로 정의합니다.예를 들어, {"먹음": [먹는 것","먹는 것","먹는 것]].이것은 데이터/자료 라이브러리의 단어를 규범화하는 데 도움이 된다.
    우리는 모든 태그를 분석하고 비기본 형식의 단어 목록에 나타나는지 확인합니다.만약 그렇다면, 이 단어의 기본 형식을 사용한다.아래의 함수는 이 점을 보여 주었다.
    def stemming(filtered_tokens):
        root_to_token = {'you have':['youve'],
                        'select':['selected', 'selection'],
                        'it is':['its'],
                        'move':['moving'],
                        'photo':['photos'],
                        'success':['successfully', 'successful']
        }
    
        base_form_tokens = []
        for token in filtered_tokens:
            for base_form, token_list in root_to_token.items():
                if token in token_list:
                    base_form_tokens.append(base_form)
                else:
                    base_form_tokens.append(token)
        return base_form_tokens
    
    이제 위에서 정의한 함수를 사용하여 다음과 같이 기본 프로세싱 파이핑을 형성합니다.
    tokens = []
    for email in emails:
        email = email[0].lower().split()
        for word in email:
            clean_word = punctuation_removal(word)
            tokens.append(clean_word)
    tokens = set(tokens)
    filtered_tokens = stopword_removal(tokens)
    base_form_tokens = stemming(filtered_tokens)
    

    2. 독특한 단어 찾기


    전자 우편이 기본 형식의 태그 목록으로 변환된 후에 문장부호와 정지어가 없습니다. set () 함수를 사용하면 유일한 단어만 얻을 수 있습니다.
    unique_words = []
    unique_words = set(base_form_tokens)
    

    3. 특징 벡터 추출


    각 피쳐 벡터는 고유한 단어 목록과 동일한 길이로 정의됩니다.모든 유일한 단어에 대해 특정한 전자메일에 나타나면 벡터에 1을 추가하지 않으면 0을 추가합니다.예를 들어 이메일 "헤이, 난 베티야!"유일한 단어 목록은 ['안녕','헤이','샌드위치','나','그것은','표시']이고 특징 벡터는 [0,1,0,0,1,0]이다."betty"는 유일한 단어 목록에 없기 때문에 최종 결과에서 무시됩니다.
    다음 코드 세션은 이 점을 보여 줍니다. 특징 벡터는python 사전이고 키는 유일한 단어이며 값은 0 또는 1입니다. 이것은 이 단어가 전자메일에 나타나는지 여부에 달려 있습니다.각 e-메일에 대한 레이블도 저장됩니다.
    feature_vec = {}
    for word in unique_words:
        feature_vec[word] = word in base_form_tokens
    pair = (feature_vec, email[1]) #email[1] is the label for each email
    train_data.append(pair)
    
    이렇게 하면 우리는 훈련 데이터를 생성할 수 있다.다음은 이 단계까지의 완전한 파이프의 코드 세션을 보여 줍니다.
    train_data = []
    for email in emails:
        tokens = []
        word_list = email[0].lower().split()
        for word in word_list:
            clean_word = punctuation_removal(word)
            tokens.append(clean_word)
        filtered_tokens = stopword_removal(tokens)
        base_form_tokens = stemming(filtered_tokens)
        feature_vec = {}
        for word in unique_words:
            feature_vec[word] = word in base_form_tokens
        pair = (feature_vec, email[1]) 
        train_data.append(pair)
    

    4. 소박 베일러 분류기 활용


    소박 베일러 분류기는 nltk 모듈에서 가져온 것입니다.우리는 현재 모든 전자메일의 특징 벡터 (예를 들어 '테스트 기능') 를 찾을 수 있으며, 이를 스팸메일로 분류할 수 있다.
    from nltk import NaiveBayesClassifier
    classifier = NaiveBayesClassifier.train(train_data)
    output = classifier.classify(test_features)
    
    다음은 온전한 테스트 파이프-
    def testing(email_str):
        tokens = []
        word_list = email_str.lower().split()
        for word in word_list:
            clean_word = punctuation_removal(word)
            tokens.append(clean_word)
        filtered_tokens = stopword_removal(tokens)
        base_form_tokens = stemming(filtered_tokens)
        test_features = {}
        for word in unique_words:
            test_features[word] = word in base_form_tokens
        output = classifier.classify(test_features)
        return output
    
    이것들이 있으면, 당신은 이제 기본적인 자연 언어 처리 파이프의 세부 사항을 알게 될 것입니다.도움이 됐으면 좋겠어요!

    좋은 웹페이지 즐겨찾기