Main Content

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

일본어 텍스트 데이터 분석하기

이 예제에서는 토픽 모델을 사용하여 일본어 텍스트 데이터를 가져와서 준비하고 분석하는 방법을 보여줍니다.

일본어 텍스트 데이터가 클수록 통계 분석에 부정적 영향을 주는 잡음 데이터가 많이 들어 있을 수 있습니다. 예를 들어, 텍스트 데이터에 다음이 포함되어 있을 수 있습니다.

  • 어형이 변형된 단어. 예를 들면 "難しい"("어렵다")와 "難しかった"("어려웠다")

  • 잡음을 추가하는 단어. 예를 들면 "あそこ"("저기"), "あたり"("~당"), "あちら"("저쪽") 같은 불용어

  • 문장 부호 및 특수 문자

다음 워드 클라우드는 공장 보고서 세트의 원시 텍스트 데이터에 단어 빈도 분석을 적용한 버전과 동일한 텍스트 데이터를 전처리한 버전을 나타낸 것입니다.

이 예제에서는 먼저 일본어 텍스트 데이터를 가져와서 준비하는 방법을 보여준 다음, LDA(잠재 디리클레 할당) 모델을 사용하여 텍스트 데이터를 분석하는 방법을 보여줍니다. LDA 모델은 문서 모음에서 기저 토픽을 발견하고 토픽 내 단어 확률을 추정하는 토픽 모델입니다.

데이터 가져오기

예제 데이터 "factoryReportsJP.csv"를 불러옵니다. 이 데이터에는 각 이벤트에 대한 일본어 텍스트 설명과 범주 레이블이 포함된 공장 보고서가 들어 있습니다. readtable 함수를 사용하여 테이블을 읽어온 후 텍스트를 string형으로 추출합니다. ReadVariableNames 옵션을 false로 설정하여 테이블 변수에 이름 "Var1", "Var2", ..., "Var5"를 할당합니다.

filename = "factoryReportsJP.csv";
data = readtable(filename,"TextType","string","ReadVariableNames",false);

테이블의 처음 몇 개의 행을 표시합니다. 테이블에는 다음 변수가 포함되어 있습니다.

  • Var1 — 설명

  • Var2 — 범주

  • Var3 — 긴급성

  • Var4 — 해결

  • Var5 — 비용

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

textData = data.Var1;
textData(1:10)
ans = 10×1 string
    "スキャナーのスプールにアイテムが詰まることがある。"
    "アセンブラのピストンからガタガタと大きな音がします。"
    "工場起動時に電源が切れる。"
    "アセンブラのコンデンサが飛ぶ。"
    "ミキサーでヒューズが切れる。"
    "コンストラクション・エージェントのパイプが破裂して冷却水を噴射している。"
    "ミキサーでヒューズが飛んだ。"
    "ベルトから物が続々と落ちてきます。"
    "ベルトから物が落下する。"
    "スキャナーのリールが割れている、すぐにカーブし始める。"

텍스트 데이터를 워드 클라우드로 시각화합니다.

figure
wordcloud(textData);

문서 토큰화하기

tokenizedDocument를 사용하여 텍스트를 토큰화한 다음 처음 몇 개 문서를 표시합니다.

documents = tokenizedDocument(textData);
documents(1:10)
ans = 
  10×1 tokenizedDocument:

    11 tokens: スキャナー の スプール に アイテム が 詰まる こと が ある 。
    12 tokens: アセンブラ の ピストン から ガタガタ と 大きな 音 が し ます 。
     8 tokens: 工場 起動 時 に 電源 が 切れる 。
     6 tokens: アセンブラ の コンデンサ が 飛ぶ 。
     6 tokens: ミキサー で ヒューズ が 切れる 。
    17 tokens: コンストラクション ・ エージェント の パイプ が 破裂 し て 冷却 水 を 噴射 し て いる 。
     7 tokens: ミキサー で ヒューズ が 飛ん だ 。
    11 tokens: ベルト から 物 が 続々 と 落ち て き ます 。
     7 tokens: ベルト から 物 が 落下 する 。
    14 tokens: スキャナー の リール が 割れ て いる 、 すぐ に カーブ し 始める 。

품사 태그 가져오기

토큰 세부 정보를 가져온 다음 처음 몇 개 토큰에 대한 세부 정보를 표시합니다.

tdetails = tokenDetails(documents);
head(tdetails)
ans=8×8 table
       Token       DocumentNumber    LineNumber     Type      Language    PartOfSpeech       Lemma         Entity  
    ___________    ______________    __________    _______    ________    ____________    ___________    __________

    "スキャナー"          1               1         letters       ja        noun           "スキャナー"     non-entity
    "の"                 1               1         letters       ja        adposition     "の"           non-entity
    "スプール"            1               1         letters       ja        noun           "スプール"       non-entity
    "に"                 1               1         letters       ja        adposition     "に"           non-entity
    "アイテム"            1               1         letters       ja        noun           "アイテム"       non-entity
    "が"                 1               1         letters       ja        adposition     "が"           non-entity
    "詰まる"              1               1         letters       ja        verb           "詰まる"        non-entity
    "こと"               1               1         letters       ja        noun           "こと"          non-entity

테이블의 PartOfSpeech 변수에는 토큰의 품사 태그가 포함되어 있습니다. 모두 명사로만 구성된 워드 클라우드와 모두 형용사로만 구성된 워드 클라우드를 각각 만듭니다.

figure
idx = tdetails.PartOfSpeech == "noun";
tokens = tdetails.Token(idx);
subplot(1,2,1)
wordcloud(tokens);
title("Nouns")

idx = tdetails.PartOfSpeech == "adjective";
tokens = tdetails.Token(idx);
subplot(1,2,2)
wc = wordcloud(tokens);
title("Adjectives")

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

불용어를 제거합니다.

documents = removeStopWords(documents);
documents(1:10)
ans = 
  10×1 tokenizedDocument:

    5 tokens: スキャナー スプール アイテム 詰まる 。
    6 tokens: アセンブラ ピストン ガタガタ 大きな 音 。
    5 tokens: 工場 起動 電源 切れる 。
    4 tokens: アセンブラ コンデンサ 飛ぶ 。
    4 tokens: ミキサー ヒューズ 切れる 。
    8 tokens: コンストラクション ・ エージェント パイプ 破裂 冷却 噴射 。
    4 tokens: ミキサー ヒューズ 飛ん 。
    6 tokens: ベルト 物 続々 落ち き 。
    4 tokens: ベルト 物 落下 。
    8 tokens: スキャナー リール 割れ 、 すぐ カーブ 始める 。

문장 부호를 지웁니다.

documents = erasePunctuation(documents);
documents(1:10)
ans = 
  10×1 tokenizedDocument:

    4 tokens: スキャナー スプール アイテム 詰まる
    5 tokens: アセンブラ ピストン ガタガタ 大きな 音
    4 tokens: 工場 起動 電源 切れる
    3 tokens: アセンブラ コンデンサ 飛ぶ
    3 tokens: ミキサー ヒューズ 切れる
    6 tokens: コンストラクション エージェント パイプ 破裂 冷却 噴射
    3 tokens: ミキサー ヒューズ 飛ん
    5 tokens: ベルト 物 続々 落ち き
    3 tokens: ベルト 物 落下
    6 tokens: スキャナー リール 割れ すぐ カーブ 始める

normalizeWords를 사용하여 텍스트에서 표제어를 추출합니다.

documents = normalizeWords(documents);
documents(1:10)
ans = 
  10×1 tokenizedDocument:

    4 tokens: スキャナー スプール アイテム 詰まる
    5 tokens: アセンブラ ピストン ガタガタ 大きな 音
    4 tokens: 工場 起動 電源 切れる
    3 tokens: アセンブラ コンデンサ 飛ぶ
    3 tokens: ミキサー ヒューズ 切れる
    6 tokens: コンストラクション エージェント パイプ 破裂 冷却 噴射
    3 tokens: ミキサー ヒューズ 飛ぶ
    5 tokens: ベルト 物 続々 落ちる くる
    3 tokens: ベルト 物 落下
    6 tokens: スキャナー リール 割れる すぐ カーブ 始める

불용어 제거, 문장 부호 지우기 같은 일부 전처리 단계를 거치면 빈 문서가 반환됩니다. removeEmptyDocuments 함수를 사용하여 빈 문서를 제거합니다.

documents = removeEmptyDocuments(documents);

전처리 함수 만들기

전처리를 수행하는 함수를 만들면 서로 다른 텍스트 데이터 모음을 동일한 방식으로 준비하는 데 유용할 수 있습니다. 예를 들어, 함수를 사용하여 훈련 데이터와 동일한 단계로 새 데이터를 전처리할 수 있습니다.

분석에 사용할 텍스트 데이터를 토큰화하고 전처리하는 함수를 만듭니다. 함수 preprocessText는 다음 단계를 수행합니다.

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

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

  3. removeStopWords를 사용하여 불용어 목록(예: "あそこ", "あたり", "あちら")을 제거합니다.

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

removeEmptyDocuments 함수를 사용하여, 전처리한 후의 빈 문서를 제거합니다. 전처리 함수를 사용한 후에 문서를 제거하면 다른 소스의 레이블 같은 데이터를 더 쉽게 제거할 수 있습니다.

이 예제에서는 전처리 함수 preprocessText(예제 끝에 나와 있음)를 사용하여 텍스트 데이터를 준비합니다.

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

    4 tokens: スキャナー スプール アイテム 詰まる
    5 tokens: アセンブラ ピストン ガタガタ 大きな 音
    4 tokens: 工場 起動 電源 切れる
    3 tokens: アセンブラ コンデンサ 飛ぶ
    3 tokens: ミキサー ヒューズ 切れる

빈 문서를 제거합니다.

documents = removeEmptyDocuments(documents);

토픽 모델 피팅하기

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

데이터에 LDA 모델을 피팅하려면 먼저 bag-of-words 모델을 만들어야 합니다. bag-of-words 모델(단어 빈도 카운터라고도 함)은 단어가 문서 모음의 각 문서에서 나타나는 횟수를 기록합니다. bagOfWords를 사용하여 bag-of-words 모델을 만듭니다.

bag = bagOfWords(documents);

bag-of-words 모델에서 빈 문서를 제거합니다.

bag = removeEmptyDocuments(bag);

fitlda를 사용하여 7개 토픽으로 LDA 모델을 피팅합니다. 세부 정보가 출력되지 않도록 하려면 'Verbose'0으로 설정하십시오.

numTopics = 7;
mdl = fitlda(bag,numTopics,"Verbose",0);

워드 클라우드를 사용하여 처음 4개 토픽을 시각화합니다.

figure
for i = 1:4
    subplot(2,2,i)
    wordcloud(mdl,i);
    title("Topic " + i)
end

누적형 막대 차트를 사용하여 여러 토픽 혼합을 시각화합니다. 무작위로 5개의 입력 문서를 표시하고 해당하는 토픽 혼합을 시각화합니다.

numDocuments = numel(documents);
idx = randperm(numDocuments,5);
documents(idx)
ans = 
  5×1 tokenizedDocument:

    4 tokens: ミキサー 激しい 揺れる 音
    3 tokens: ベルト 物 落下
    3 tokens: コンベア ベルト 詰まる
    4 tokens: ミキサー 冷却 あちこち こぼれる
    3 tokens: トランスポート ライン 動く

topicMixtures = transform(mdl,documents(idx));
figure
barh(topicMixtures(1:5,:),"stacked")
xlim([0 1])
title("Topic Mixtures")
xlabel("Topic Probability")
ylabel("Document")
legend("Topic " + string(1:numTopics),"Location","northeastoutside")

예제 전처리 함수

함수 preprocessText는 다음 단계를 수행합니다.

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

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

  3. removeStopWords를 사용하여 불용어 목록(예: "あそこ", "あたり", "あちら")을 제거합니다.

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

function documents = preprocessText(textData)

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

% Erase the punctuation.
documents = erasePunctuation(documents);

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

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

참고 항목

| | | | |

관련 항목