일본어 텍스트 데이터 분석하기
이 예제에서는 토픽 모델을 사용하여 일본어 텍스트 데이터를 가져와서 준비하고 분석하는 방법을 보여줍니다.
일본어 텍스트 데이터가 클수록 통계 분석에 부정적 영향을 주는 잡음 데이터가 많이 들어 있을 수 있습니다. 예를 들어, 텍스트 데이터에 다음이 포함되어 있을 수 있습니다.
어형이 변형된 단어. 예를 들면 "難しい"("어렵다")와 "難しかった"("어려웠다")
잡음을 추가하는 단어. 예를 들면 "あそこ"("저기"), "あたり"("~당"), "あちら"("저쪽") 같은 불용어
문장 부호 및 특수 문자
다음 워드 클라우드는 공장 보고서 세트의 원시 텍스트 데이터에 단어 빈도 분석을 적용한 버전과 동일한 텍스트 데이터를 전처리한 버전을 나타낸 것입니다.
이 예제에서는 먼저 일본어 텍스트 데이터를 가져와서 준비하는 방법을 보여준 다음, 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)
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
는 다음 단계를 수행합니다.
tokenizedDocument
를 사용하여 텍스트를 토큰화합니다.erasePunctuation
을 사용하여 문장 부호를 지웁니다.removeStopWords
를 사용하여 불용어 목록(예: "あそこ", "あたり", "あちら")을 제거합니다.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: ミキサー 大きな 音 出る 5 tokens: スキャナー 熱 発す 動く ない 3 tokens: ミキサー 冷却 漏れる 4 tokens: ソーター 制御 電源 故障 2 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
는 다음 단계를 수행합니다.
tokenizedDocument
를 사용하여 텍스트를 토큰화합니다.erasePunctuation
을 사용하여 문장 부호를 지웁니다.removeStopWords
를 사용하여 불용어 목록(예: "あそこ", "あたり", "あちら")을 제거합니다.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
참고 항목
tokenizedDocument
| removeStopWords
| stopWords
| addPartOfSpeechDetails
| tokenDetails
| normalizeWords