본문 바로가기
빅데이터 분석기사

자연어 처리(NLP)란? | 구현 방법 | NLTK | 페이스북에서 활용

by 공불러 2023. 5. 27.
728x90
반응형

자연어 처리란? | 구현 방법 |  NLTK | 페이스북에서 활용 

자연어 처리(Natural Language Processing, NLP)

 

빅데이터 분석을 하면 꼭 마주하게 되는 자연어 처리, 말 그대로 사람이 쓰는 자연스러운 말들을 기계한테 학습시켜서 분석하는 방식입니다. 특정 문서(web)의 문장들을 읽어 의미를 파악하고 유사한 의미는 하나의 키워드로 자연어 처리는 마치 컴퓨터가 '마법의 언어 이해능력'을 가지게 하는 것과도 같습니다. 자연어 처리 기술을 통해 컴퓨터는 우리가 말하는 문장의 의미를 파악하고, 주어진 작업을 수행할 수 있게 됩니다. 예를 들어, 컴퓨터가 문장을 이해하면 우리에게 문장의 주제를 알려주거나, 단어의 뜻을 정확하게 파악해 주거나, 번역을 해 줄 수 있습니다.

 

그럼, 자연어란 무엇인지, 어떻게 처리하는지에 대해 알아보겠습니다.

분석 툴은 python입니다.

 

알아두면 좋을 단어 : TF-IDF, SVC, 기계번역, 알고리즘, 벡터화

 

 

 

목차

     

    자연어 처리(Natural Language Processing, NLP)란?

     

    자연어 처리(Natural Language Processing, NLP)는 인간이 사용하는 자연어를 컴퓨터가 이해하고 처리할 수 있도록 하는 기술입니다. 자연어(Natural Language)는 우리가 일상 생활에서 사용하는 언어로, 문장, 단어, 문서 등으로 구성됩니다. NLP는 이러한 자연어를 컴퓨터가 이해하고 처리할 수 있도록 하는 기술과 방법론을 개발하는 학문적인 분야입니다.

    자연어 처리는 다양한 응용 분야에서 활용됩니다. 예를 들어, 기계 번역, 텍스트 요약, 질의응답 시스템, 감성 분석, 정보 검색, 챗봇 등이 자연어 처리 기술을 활용한 응용 분야입니다.

    자연어 처리는 일련의 단계로 구성됩니다. 첫 번째 단계는 텍스트 전처리로, 텍스트를 정제하고 토큰화하여 컴퓨터가 처리하기 쉬운 형태로 변환합니다. 다음으로 토큰화된 단어나 문장의 구조를 분석하고 의미를 추론하는 단계가 있습니다. 이 단계에서는 품사 태깅, 구문 분석, 의미 분석 등의 기술이 사용됩니다. 마지막으로 컴퓨터가 이해한 내용을 활용하여 원하는 작업을 수행하는 응용 분야에 적용합니다.

    NLP는 컴퓨터가 인간의 언어를 이해하고 처리할 수 있게 함으로써, 사람과 컴퓨터 간의 의사 소통을 원활하게 하거나, 자연어로 기술된 방대한 양의 정보를 효율적으로 활용하는 데에 도움을 줍니다. 최근에는 딥 러닝과 같은 인공지능 기술의 발전으로 NLP의 성능이 크게 향상되었고, 다양한 형태의 자연어 처리 응용프로그램이 개발되고 있습니다.

    파이썬으로 자연어 처리 구현 방법

    아래 설명에서  re, nltk, googletrans 등은 별도의 설치 없이 파이썬에서 바로 사용할 수 있는 라이브러리입니다. 파이썬에서 별도의 설치를 하지 않아도 됩니다.

     

    scikit-learn, tensorflow 및 pytorch와 같은 라이브러리는 추가 설치가 필요합니다.

     

    pip install scikit-learn
    pip install tensorflow
    pip install pytorch


    텍스트 전처리

    자연어 처리를 시작하기 전에 텍스트 데이터를 정제하고 전처리해야 합니다. 이 단계에는 문장 토큰화, 단어 토큰화, 불용어 제거, 정규화 등이 포함될 수 있습니다. 이를 위해 파이썬의 정규 표현식 모듈인 re토큰화를 위한 라이브러리인 NLTK(Natural Language Toolkit)를 사용할 수 있습니다.

     

    아래의 예시에서는 re 모듈을 사용하여 정규 표현식 패턴을 정의하고, 텍스트에서 패턴과 일치하는 부분을 찾거나 대체하는 작업을 수행합니다. 또한, NLTK의 sent_tokenize 함수를 사용하여 텍스트를 문장 단위로 분리하고, word_tokenize 함수를 사용하여 문장을 단어 단위로 분리합니다.

     정규 표현식 모듈인 re 예시

    import re
    
    text = "This is an example sentence."
    # 소문자로 변환
    text = text.lower()
    # 구두점 제거
    text = re.sub(r'[^\w\s]', '', text)
    # 불용어 제거
    stop_words = ['is', 'an']
    text = ' '.join(word for word in text.split() if word not in stop_words)
    
    print(text)
    # 출력: "this example sentence"

     

    토큰화를 위한 라이브러리인 NLTK(Natural Language Toolkit) 예시

    import nltk
    from nltk.tokenize import word_tokenize, sent_tokenize
    
    # 문장 토큰화 예시
    text = "Natural Language Processing is an exciting field. It helps computers understand and process human language."
    sentences = sent_tokenize(text)
    print(sentences)  # 출력: ['Natural Language Processing is an exciting field.', 'It helps computers understand and process human language.']
    
    # 단어 토큰화 예시
    sentence = "This is a sample sentence."
    words = word_tokenize(sentence)
    print(words)  # 출력: ['This', 'is', 'a', 'sample', 'sentence.']

    품사 태깅

    텍스트에서 단어의 품사를 태깅하는 작업은 자연어 처리의 일부입니다. NLTK는 품사 태깅을 수행할 수 있는 함수와 데이터셋을 제공합니다.

     

    import nltk
    
    text = "This is a sample sentence."
    tokens = nltk.word_tokenize(text)
    pos_tags = nltk.pos_tag(tokens)
    
    print(pos_tags)
    # 출력: [('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('sample', 'NN'), ('sentence', 'NN')]



    구문 분석

    텍스트의 문장 구조를 분석하는 것은 자연어 처리의 중요한 단계입니다. 이를 위해 구문 분석 도구인 NLTK, SpaCy, Stanford Parser 등을 사용할 수 있습니다.

     

    NLTK를 사용하여 구문 분석

    아래 예시에서는 NLTK를 사용하여 구문 분석을 수행합니다. 먼저, 문법을 정의하기 위해 CFG.fromstring 함수를 사용하여 문법을 작성합니다. 그 후, ChartParser를 사용하여 문장을 구문 분석합니다. 이를 위해 문장을 단어로 분리한 후 parse 함수에 전달합니다. 구문 분석 결과를 pretty_print 함수로 출력합니다.

    import nltk
    from nltk import CFG
    
    # 구문 분석을 위한 문법 정의
    grammar = CFG.fromstring("""
        S -> NP VP
        NP -> Det N
        VP -> V NP
        Det -> 'the' | 'a'
        N -> 'dog' | 'cat'
        V -> 'chased' | 'ate'
    """)
    
    # 구문 분석 수행
    parser = nltk.ChartParser(grammar)
    sentence = "the dog chased a cat"
    for tree in parser.parse(sentence.split()):
        tree.pretty_print()

     

     SpaCy를 사용하여 구문 분석

    아래는 SpaCy를 사용하여 구문 분석을 수행합니다. 먼저, 영어 모델을 로드합니다. 그 후, nlp 객체를 사용하여 문장을 처리하고, noun_chunks 속성을 사용하여 명사구를 추출합니다. 각 명사구의 텍스트와 주요 단어를 출력합니다.

    import spacy
    
    # SpaCy의 영어 모델 로드
    nlp = spacy.load("en_core_web_sm")
    
    # 구문 분석 수행
    sentence = "The cat chased the mouse."
    doc = nlp(sentence)
    for chunk in doc.noun_chunks:
        print(chunk.text, "-->", chunk.root.text)

     

    NLTK의 StanfordParser를 사용하여 Stanford Parser를 호출

    아래는 NLTK의 StanfordParser를 사용하여 Stanford Parser를 호출합니다. 먼저, Stanford Parser의 경로를 설정합니다. 그 후, StanfordParser를 초기화하고, raw_parse 함수에 문장을 전달하여 구문 분석을 수행합니다. 구문 분석 결과를 pretty_print 함수로 출력합니다.

    from nltk.parse import stanford
    
    # Stanford Parser 경로 설정
    stanford_parser_dir = 'stanford-parser/'
    model_path = stanford_parser_dir + "stanford-parser-3.9.2-models.jar"
    jar_path = stanford_parser_dir + "stanford-parser.jar"
    
    # 구문 분석 수행
    sentence = "The cat chased the mouse."
    parser = stanford.StanfordParser(model_path=model_path, path_to_jar=jar_path)
    parsed_sentences = parser.raw_parse(sentence)
    for parsed_sentence in parsed_sentences:
        for tree in parsed_sentence:
            tree.pretty_print()

     

     

     

    원형 복원 및 표제어 추출

    단어의 원형 복원이나 표제어 추출은 단어를 그것의 기본 형태로 변환하는 작업입니다. 이를 위해 NLTK, SpaCy, KoNLPy(Korean NLP in Python) 등의 라이브러리를 활용할 수 있습니다.

     

    0. 원형 복원 및 표제어 추출 예시 코드

    from nltk.stem import WordNetLemmatizer
    
    lemmatizer = WordNetLemmatizer()
    
    word = "running"
    lemma = lemmatizer.lemmatize(word, pos='v')
    print(lemma)
    # 출력: "run"
    
    word = "better"
    lemma = lemmatizer.lemmatize(word, pos='a')
    print(lemma)
    # 출력: "good"

     

     

    1. WordNetLemmatizer를 임포트합니다. 

    WordNetLemmatizer는 WordNet 프로젝트에서 제공하는 영어 단어의 원형 복원을 수행하는 클래스입니다.

    from nltk.stem import WordNetLemmatizer

     

    2.  WordNetLemmatizer 객체를 생성

    lemmatizer = WordNetLemmatizer()

    3. 동사의 원형으로 변환

    첫 번째 예시에서는 단어 "running"을 동사의 원형으로 변환합니다. lemmatize 함수를 사용하고, pos 매개변수에 'v'를 전달하여 동사를 나타냅니다.

    word = "running"
    lemma = lemmatizer.lemmatize(word, pos='v')
    print(lemma)
    # 출력: "run"

    4. 형용사의 원형

    단어 "better"를 형용사의 원형으로 변환합니다. pos 매개변수에 'a'를 전달하여 형용사를 나타냅니다.

    word = "better"
    lemma = lemmatizer.lemmatize(word, pos='a')
    print(lemma)
    # 출력: "good"

    lemmatize 함수는 주어진 단어를 원형으로 변환하여 반환합니다. 단어의 품사를 명시적으로 지정함으로써 정확한 원형 복원을 수행할 수 있습니다.

    위의 코드 예시를 통해 WordNetLemmatizer를 사용하여 단어의 원형 복원을 할 수 있음을 알 수 있습니다.

    문서 분류 및 감성 분석

    텍스트 데이터를 기반으로 문서 분류나 감성 분석을 수행하는 경우, 머신 러닝 알고리즘과 라이브러리를 사용할 수 있습니다. Scikit-learn, TensorFlow, PyTorch 등의 라이브러리를 활용하여 분류 모델을 구축할 수 있습니다.

     

    문서 분류 및 감성 분석 예시 코드

    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.svm import SVC
    
    # 데이터셋 준비
    corpus = ["This is a positive review.",
              "I am not happy with the product.",
              "The movie was great.",
              "I didn't like the ending."]
    
    labels = [1, 0, 1, 0]  # 1: 긍정, 0: 부정
    
    # 벡터화
    vectorizer = TfidfVectorizer()
    X = vectorizer.fit_transform(corpus)
    
    # 분류 모델 학습
    clf = SVC()
    clf.fit(X, labels)
    
    # 새로운 문서 분류
    new_doc = ["The product exceeded my expectations."]
    new_doc_vectorized = vectorizer.transform(new_doc)
    prediction = clf.predict(new_doc_vectorized)
    
    print(prediction)
    # 출력: [1] (긍정)

     

    1.필요한 라이브러리를 임포트

    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.svm import SVC

    2. 데이터 셋 준비

    corpus 리스트에는 문서들이 포함되어 있고, labels 리스트에는 해당 문서들의 감성 레이블(긍정 또는 부정)이 포함되어 있습니다.

    corpus = ["This is a positive review.",
              "I am not happy with the product.",
              "The movie was great.",
              "I didn't like the ending."]
    
    labels = [1, 0, 1, 0]

    3. TfidfVectorizer를 사용하여 문서를 TF-IDF 벡터로 변환

    이를 통해 문서의 단어들을 수치화하여 벡터 형태로 표현할 수 있습니다.

    vectorizer = TfidfVectorizer()
    X = vectorizer.fit_transform(corpus)

    4. SVC를 사용하여 분류 모델을 학습

    SVC는 Support Vector Classifier의 약자로, SVM(Support Vector Machine) 알고리즘을 기반으로 한 분류 모델입니다.

    clf = SVC()
    clf.fit(X, labels)

    5.새로운 문서를 분류하기 위해 벡터화

     transform 함수를 사용하여 새로운 문서를 이전에 학습한 vectorizer를 사용해 벡터로 변환합니다.

    new_doc = ["The product exceeded my expectations."]
    new_doc_vectorized = vectorizer.transform(new_doc)

    6. 학습된 모델을 사용하여 새로운 문서의 감성을 예측

    마지막으로, 학습된 모델을 사용하여 새로운 문서의 감성을 예측합니다. predict 함수를 사용하여 예측값을 출력합니다.

    prediction = clf.predict(new_doc_vectorized)
    print(prediction)
    # 출력: [1] (긍정)

    위의 코드 예시를 통해 TfidfVectorizer와 SVC를 사용하여 텍스트 데이터를 벡터화하고, 분류 모델을 학습하여 새로운 문서의 감성을 예측하는 과정을 알 수 있습니다.

     

    기계 번역

    파이썬을 사용하여 기계 번역 시스템을 구현할 수도 있습니다. 이를 위해 구글의 번역 API나 다른 번역 라이브러리들을 활용할 수 있습니다.

     

    import googletrans
    
    translator = googletrans.Translator()
    
    text = "Hello, how are you?"
    translation = translator.translate(text, dest='ko')
    
    print(translation.text)
    # 출력: "안녕하세요, 어떻게 지내세요?"

     

    페이스북에서 자연어 처리

    페이스북에서 자연어 처리

    원리

    자연어 처리는 텍스트 데이터를 이해하고 해석하는 기술로, 페이스북에서 사용자들의 의견을 조사하기 위해 자연어 처리 기술을 활용할 수 있습니다. 이를 통해 텍스트 데이터를 분석하고 주제, 감성, 키워드 등을 파악하여 사용자의 의견을 이해하고 요약할 수 있습니다.

    필요성

    • 대량의 텍스트 데이터를 효율적으로 분석하여 의견의 흐름을 파악할 수 있습니다.
    • 사용자들의 요구사항과 의견을 신속하게 파악하여 제품 또는 서비스 개선에 활용할 수 있습니다.
    • 사용자들의 감성 분석을 통해 제품 또는 서비스에 대한 전반적인 만족도를 파악할 수 있습니다.
    • 특정 주제에 대한 사용자들의 의견을 추출하여 마케팅 전략을 수립할 수 있습니다.

    데이터 처리 방법

     

    데이터 수집

    페이스북에서 사용자들의 의견을 수집하기 위해 해당 플랫폼의 API를 활용하거나 웹 스크래핑 기술을 이용하여 게시물, 댓글, 리뷰 등의 데이터를 수집합니다. 페이스북, 인스타그램은 자신들이 자신 DB를 API로 제공함으로 꼭 크롤링을 해야하는 것은 아니지만 유료로 확인해야 하기 때문에 부담은 있습니다.

    전처리

    수집한 데이터에 대해 자연어 처리 기법을 적용하여 텍스트 데이터를 정제하고 토큰화, 품사 태깅, 구문 분석 등의 작업을 수행합니다.

    텍스트 분석

    자연어 처리 기술을 활용하여 텍스트 데이터를 분석합니다. 키워드 추출, 감성 분석, 문서 분류 등의 작업을 통해 사용자의 의견을 이해하고 요약할 수 있습니다.

     

    시각화 및 결과 해석

    분석 결과를 시각화하여 보여줌으로써 의사 결정에 도움을 줍니다. 특정 주제에 대한 의견의 흐름을 파악하고, 사용자들의 반응을 종합하여 필요한 개선 사항을 도출합니다.

     

    파이썬으로 페이스북 데이터 분석 방법

    import requests
    import json
    from nltk.sentiment import SentimentIntensityAnalyzer
    
    # 페이스북 API에서 게시물 및 댓글 데이터 가져오기
    def fetch_facebook_data(post_id, access_token):
        url = f"https://graph.facebook.com/v14.0/{post_id}/comments"
        params = {
            "access_token": access_token
        }
        response = requests.get(url, params=params)
        data = response.json()
        return data
    
    # 게시물 및 댓글에서 텍스트 추출하기
    def extract_text(data):
        comments = data.get("data", [])
        text_list = []
        for comment in comments:
            text = comment.get("message")
            if text:
                text_list.append(text)
        return text_list
    
    # 감성 분석 수행
    def perform_sentiment_analysis(text_list):
        analyzer = SentimentIntensityAnalyzer()
        results = []
        for text in text_list:
            sentiment_score = analyzer.polarity_scores(text)
            sentiment = "positive" if sentiment_score["compound"] >= 0 else "negative"
            result = {
                "text": text,
                "sentiment": sentiment
            }
            results.append(result)
        return results
    
    # 메인 함수
    def main():
        # 페이스북 API 정보 설정
        post_id = "<포스트 ID>"
        access_token = "<액세스 토큰>"
    
        # 페이스북 데이터 가져오기
        data = fetch_facebook_data(post_id, access_token)
    
        # 텍스트 추출
        text_list = extract_text(data)
    
        # 감성 분석 수행
        results = perform_sentiment_analysis(text_list)
    
        # 결과 출력
        for result in results:
            print("Text:", result["text"])
            print("Sentiment:", result["sentiment"])
            print()
    
    if __name__ == "__main__":
        main()

    위 코드는 페이스북 API를 사용하여 특정 게시물의 댓글 데이터를 가져오고, 해당 댓글들에 대해 감성 분석을 수행하는 예시입니다.

    사용 전에 <포스트 ID>와 <액세스 토큰>을 페이스북 API 정보로 대체해야 합니다. 포스트 ID는 조사하려는 특정 게시물의 ID이고, 액세스 토큰은 페이스북 API에 접근하기 위한 인증 토큰입니다.

    코드 실행 시 해당 게시물의 댓글들이 가져와지고, 각 댓글에 대해 감성 분석을 수행하여 결과를 출력합니다. 감성은 "positive" 또는 "negative"로 나타냅니다.

    실제로 사용자들의 의견을 조사하기 위해서는 페이스북 API의 권한 설정 및 인증 과정이 필요하며, 데이터 수집과 처리에 대한 정리가 필요합니다.

    위 코드에서 fetch_facebook_data 함수는 페이스북 API를 호출하여 특정 게시물의 댓글 데이터를 가져옵니다. 이 함수는 게시물 ID와 액세스 토큰을 매개변수로 받고, API 요청을 통해 댓글 데이터를 가져온 후 JSON 형식으로 반환합니다.

    extract_text 함수는 API에서 받아온 데이터에서 각 댓글의 텍스트를 추출하여 리스트로 반환합니다. 이 함수는 fetch_facebook_data 함수의 반환값을 입력으로 받고, 댓글 데이터에서 메시지 부분을 추출하여 리스트에 저장합니다.

    perform_sentiment_analysis 함수는 감성 분석을 수행합니다. NLTK의 SentimentIntensityAnalyzer를 사용하여 각 댓글의 감성 점수를 계산하고, 해당 점수를 기반으로 긍정적인지 부정적인지를 판단합니다. 이 함수는 텍스트 리스트를 입력으로 받고, 감성 분석 결과를 딕셔너리 형태로 저장하여 리스트에 추가합니다.

    main 함수는 메인 실행 함수로, 페이스북 API 정보를 설정하고 fetch_facebook_data 함수를 통해 데이터를 가져온 후, 추출된 텍스트 리스트를 perform_sentiment_analysis 함수로 전달하여 감성 분석을 수행합니다. 감성 분석 결과를 출력합니다.

    이 코드를 실행하면 페이스북 게시물의 댓글들을 가져와 감성 분석을 수행한 결과가 출력됩니다. 이를 통해 사용자들의 의견을 긍정적인지 부정적인지를 파악할 수 있습니다.

    실제로 페이스북 API를 사용하여 사용자 의견을 조사할 때에는 페이스북 API의 권한 설정, 액세스 토큰 발급 등의 과정이 필요하며, API 호출에 제한이 있을 수 있으므로 해당 문서를 참조하고 API 사용 정책을 준수해야 합니다.

    728x90
    반응형

    댓글