Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

다단어 구문을 사용하여 텍스트 데이터 분석하기

이 예제에서는 n-gram 빈도 수를 사용하여 텍스트를 분석하는 방법을 보여줍니다.

n-gram은 연속된 n개 단어의 튜플입니다. 예를 들어 바이그램(n=2인 경우)은 "heavy rainfall"과 같이 2개의 연속된 단어입니다. 유니그램(n=1인 경우)은 하나의 단어입니다. bag-of-n-grams 모델은 여러 n-gram이 문서 모음에서 나타나는 횟수를 기록합니다.

bag-of-n-grams 모델을 사용하면 원본 텍스트 데이터에 들어있는 단어 순서에 대해 더 많은 정보를 유지할 수 있습니다. 예를 들어 bag-of-n-grams 모델은 "heavy rainfall", "thunderstorm winds"처럼 텍스트에 나타나는 짧은 구문을 캡처하는 데 더 적합합니다.

bag-of-n-grams 모델을 만들려면 bagOfNgrams를 사용하십시오. wordcloudfitlda와 같은 다른 Text Analytics Toolbox 함수에 bagOfNgrams 객체를 입력할 수 있습니다.

텍스트 데이터 불러오기 및 추출하기

예제 데이터를 불러옵니다. factoryReports.csv 파일에는 각 이벤트에 대한 텍스트 설명과 범주 레이블이 포함된 공장 보고서가 들어 있습니다. 빈 보고서가 있는 행을 제거합니다.

filename = "factoryReports.csv";
data = readtable(filename,TextType="string");

테이블에서 텍스트 데이터를 추출한 다음, 처음 몇 개의 보고서를 표시합니다.

textData = data.Description;
textData(1:5)
ans = 5×1 string
    "Items are occasionally getting stuck in the scanner spools."
    "Loud rattling and banging sounds are coming from assembler pistons."
    "There are cuts to the power when starting the plant."
    "Fried capacitors in the assembler."
    "Mixer tripped the fuses."

분석할 텍스트 데이터 준비하기

분석에 사용할 수 있도록 텍스트 데이터를 토큰화하고 전처리하는 함수를 만듭니다. 이 예제의 마지막에 나오는 함수 preprocessText는 다음 단계를 수행합니다.

  1. lower를 사용하여 텍스트 데이터를 소문자로 변환합니다.

  2. tokenizedDocument를 사용하여 텍스트를 토큰화합니다.

  3. erasePunctuation을 사용하여 문장 부호를 지웁니다.

  4. removeStopWords를 사용하여 불용어 목록(예: "and", "of", "the")을 제거합니다.

  5. removeShortWords를 사용하여 2자 이하로 이루어진 단어를 제거합니다.

  6. removeLongWords를 사용하여 15자 이상으로 이루어진 단어를 제거합니다.

  7. normalizeWords를 사용하여 단어의 표제어를 추출합니다.

예제 전처리 함수 preprocessText를 사용하여 텍스트 데이터를 준비합니다.

documents = preprocessText(textData);
documents(1:5)
ans = 
  5×1 tokenizedDocument:

    6 tokens: item occasionally get stuck scanner spool
    7 tokens: loud rattling bang sound come assembler piston
    4 tokens: cut power start plant
    3 tokens: fry capacitor assembler
    3 tokens: mixer trip fuse

바이그램의 워드 클라우드 만들기

먼저 bagOfNgrams를 사용하여 bag-of-n-grams 모델을 만든 후, 모델을 wordcloud에 입력하여 바이그램의 워드 클라우드를 만듭니다.

길이가 2(바이그램)인 n-gram 개수를 계산하려면 디폴트 옵션으로 bagOfNgrams를 사용합니다.

bag = bagOfNgrams(documents)
bag = 
  bagOfNgrams with properties:

          Counts: [480×921 double]
      Vocabulary: ["item"    "occasionally"    "get"    "stuck"    "scanner"    "loud"    "rattling"    "bang"    "sound"    "come"    "assembler"    "cut"    "power"    "start"    "fry"    "capacitor"    "mixer"    "trip"    "burst"    "pipe"    …    ]
          Ngrams: [921×2 string]
    NgramLengths: 2
       NumNgrams: 921
    NumDocuments: 480

워드 클라우드를 사용하여 bag-of-n-grams 모델을 시각화합니다.

figure
wordcloud(bag);
title("Text Data: Preprocessed Bigrams")

Bag-of-N-Grams에 토픽 모델 피팅하기

LDA(잠재 디리클레 할당) 모델은 문서 모음에서 기저 토픽을 발견하고 토픽 내 단어 확률을 추정하는 토픽 모델입니다.

fitlda를 사용하여 10개 토픽이 있는 LDA 토픽 모델을 만듭니다. 함수는 n-gram을 하나의 단어로 취급하여 LDA 모델을 피팅합니다.

mdl = fitlda(bag,10,Verbose=0);

처음 4개 토픽을 워드 클라우드로 시각화합니다.

figure
tiledlayout("flow");
for i = 1:4
    nexttile
    wordcloud(mdl,i);
    title("LDA Topic " + i)
end

워드 클라우드는 LDA 토픽에서 주로 함께 나타나는 바이그램을 강조 표시합니다. 함수는 지정된 LDA 토픽의 확률에 해당하는 크기로 바이그램을 플로팅합니다.

긴 구문을 사용하여 텍스트 분석하기

긴 구문을 사용하여 텍스트를 분석하려면 bagOfNgramsNGramLengths 옵션을 더 큰 값으로 지정합니다.

긴 구문을 사용하면 모델에서 불용어를 유지하는 데 유용할 수 있습니다. 예를 들어 "is not happy"라는 구문을 검출하려면 모델에서 불용어인 "is"와 "not"을 유지해야 합니다.

텍스트를 전처리합니다. erasePunctuation을 사용하여 문장 부호를 지우고 tokenizedDocument를 사용하여 토큰화합니다.

cleanTextData = erasePunctuation(textData);
documents = tokenizedDocument(cleanTextData);

길이가 3(트라이그램)인 n-gram 개수를 계산하려면 bagOfNgrams를 사용하고 NGramLengths를 3으로 지정합니다.

bag = bagOfNgrams(documents,NGramLengths=3);

워드 클라우드를 사용하여 bag-of-n-grams 모델을 시각화합니다. 트라이그램의 워드 클라우드에서 개별 단어의 문맥이 더 잘 나타납니다.

figure
wordcloud(bag);
title("Text Data: Trigrams")

topkngrams를 사용하여 상위 10개 트라이그램 및 빈도 수를 표시합니다.

tbl = topkngrams(bag,10)
tbl=10×3 table
                  Ngram                   Count    NgramLength
    __________________________________    _____    ___________

    "in"       "the"         "mixer"       14           3     
    "in"       "the"         "scanner"     13           3     
    "blown"    "in"          "the"          9           3     
    "the"      "robot"       "arm"          7           3     
    "stuck"    "in"          "the"          6           3     
    "is"       "spraying"    "coolant"      6           3     
    "from"     "time"        "to"           6           3     
    "time"     "to"          "time"         6           3     
    "heard"    "in"          "the"          6           3     
    "on"       "the"         "floor"        6           3     

예제 전처리 함수

함수 preprocessText는 다음 단계를 순서대로 수행합니다.

  1. lower를 사용하여 텍스트 데이터를 소문자로 변환합니다.

  2. tokenizedDocument를 사용하여 텍스트를 토큰화합니다.

  3. erasePunctuation을 사용하여 문장 부호를 지웁니다.

  4. removeStopWords를 사용하여 불용어 목록(예: "and", "of", "the")을 제거합니다.

  5. removeShortWords를 사용하여 2자 이하로 이루어진 단어를 제거합니다.

  6. removeLongWords를 사용하여 15자 이상으로 이루어진 단어를 제거합니다.

  7. normalizeWords를 사용하여 단어의 표제어를 추출합니다.

function documents = preprocessText(textData)

% Convert the text data to lowercase.
cleanTextData = lower(textData);

% Tokenize the text.
documents = tokenizedDocument(cleanTextData);

% Erase punctuation.
documents = erasePunctuation(documents);

% Remove a list of stop words.
documents = removeStopWords(documents);

% Remove words with 2 or fewer characters, and words with 15 or greater
% characters.
documents = removeShortWords(documents,2);
documents = removeLongWords(documents,15);

% Lemmatize the words.
documents = addPartOfSpeechDetails(documents);
documents = normalizeWords(documents,Style="lemma");

end

참고 항목

| | | | | | | | | | | |

관련 항목