پیش پردازش داده های متنی برای تجزیه و تحلیل در MATLAB
این مثال نحوه ایجاد تابعی را در متلب نشان می دهد که داده های متنی را برای تجزیه و تحلیل و پاکسازی پیش پردازش می کند. داده های متنی می تواند بزرگ باشد و همچنین حاوی نویزهای زیادی باشد که بر روی تحلیل آماری تأثیر منفی می گذارد. به عنوان مثال، داده های متنی می تواند حاوی موارد زیر باشد:
- تغییرات موردی، به عنوان مثال “new” و “New”
- تغییرات در اشکال کلمه، به عنوان مثال “walk” و “walking”
- کلماتی که نویز اضافه می کنند، به عنوان مثال کلماتی مانند “the” و “of” را متوقف می کنند
- علائم نگارشی و کاراکترهای خاص
- تگ های HTML و XML
این ابرهای کلمه ای، تجزیه و تحلیل بسامد کلمه را نشان می دهند که برای برخی از داده های متنی خام از گزارش های کارخانه ای، و یک نسخه از پیش پردازش شده همان داده های متنی اعمال می شود.
لود و استخراج داده های متنی
داده های نمونه را بارگیری کنید. فایل factoryReports.csv حاوی گزارش های کارخانه، از جمله توضیحات متنی و برچسب های دسته بندی برای هر رویداد است.
1 2 | filename = "factoryReports.csv"; data = readtable(filename,'TextType','string'); |
داده های متنی را از قسمت Description و داده های برچسب را از فیلد Category استخراج کنید.
1 2 3 | textData = data.Description; labels = data.Category; textData(1:10) |
1 2 3 4 5 6 7 8 9 10 11 | ans = 10×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." "Burst pipe in the constructing agent is spraying coolant." "A fuse is blown in the mixer." "Things continue to tumble off of the belt." "Falling items from the conveyor belt." "The scanner reel is split, it will soon begin to curve." |
قطعه بندی اسناد (Tokenized Documents)
آرایه ای از اسناد قطع بندی شده ایجاد کنید.
1 2 | cleanedDocuments = tokenizedDocument(textData); cleanedDocuments(1:10) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | ans = 10×1 tokenizedDocument: 10 tokens: Items are occasionally getting stuck in the scanner spools . 11 tokens: Loud rattling and banging sounds are coming from assembler pistons . 11 tokens: There are cuts to the power when starting the plant . 6 tokens: Fried capacitors in the assembler . 5 tokens: Mixer tripped the fuses . 10 tokens: Burst pipe in the constructing agent is spraying coolant . 8 tokens: A fuse is blown in the mixer . 9 tokens: Things continue to tumble off of the belt . 7 tokens: Falling items from the conveyor belt . 13 tokens: The scanner reel is split , it will soon begin to curve . |
برای بهبود واژه سازی (Lemmatization) ، بخشی از جزئیات گفتار را با استفاده از addPartOfSpeechDetails به اسناد اضافه کنید. از تابع addPartOfSpeech قبل از حذف کلمات توقف و lemmatizing استفاده کنید.
1 | cleanedDocuments = addPartOfSpeechDetails(cleanedDocuments); |
کلماتی مانند “a” ، “and” ، “to” و “the” که به کلمات توقف معروف هستند، می توانند به داده ها نویز اضافه کنند. شما می توانید با استفاده از تابع removeStopWords فهرستی از کلمات توقف را حذف کنید. قبل از استفاده از تابع normalizeWords از تابع removeStopWords استفاده نمایید.
1 2 | cleanedDocuments = removeStopWords(cleanedDocuments); cleanedDocuments(1:10) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | ans = 10×1 tokenizedDocument: 7 tokens: Items occasionally getting stuck scanner spools . 8 tokens: Loud rattling banging sounds coming assembler pistons . 5 tokens: cuts power starting plant . 4 tokens: Fried capacitors assembler . 4 tokens: Mixer tripped fuses . 7 tokens: Burst pipe constructing agent spraying coolant . 4 tokens: fuse blown mixer . 6 tokens: Things continue tumble off belt . 5 tokens: Falling items conveyor belt . 8 tokens: scanner reel split , soon begin curve . |
کلمات را با استفاده از normalizeWords یکنواخت کنید.
1 2 | cleanedDocuments = normalizeWords(cleanedDocuments,'Style','lemma'); cleanedDocuments(1:10) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | ans = 10×1 tokenizedDocument: 7 tokens: items occasionally get stuck scanner spool . 8 tokens: loud rattle bang sound come assembler piston . 5 tokens: cut power start plant . 4 tokens: fry capacitor assembler . 4 tokens: mixer trip fuse . 7 tokens: burst pipe constructing agent spray coolant . 4 tokens: fuse blow mixer . 6 tokens: thing continue tumble off belt . 5 tokens: fall item conveyor belt . 8 tokens: scanner reel split , soon begin curve . |
علائم نگارشی را از اسناد پاک کنید.
1 2 | cleanedDocuments = erasePunctuation(cleanedDocuments); cleanedDocuments(1:10) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | ans = 10×1 tokenizedDocument: 6 tokens: items occasionally get stuck scanner spool 7 tokens: loud rattle bang sound come assembler piston 4 tokens: cut power start plant 3 tokens: fry capacitor assembler 3 tokens: mixer trip fuse 6 tokens: burst pipe constructing agent spray coolant 3 tokens: fuse blow mixer 5 tokens: thing continue tumble off belt 4 tokens: fall item conveyor belt 6 tokens: scanner reel split soon begin curve |
کلمات با 2 نویسه یا کمتر و کلمات با 15 نویسه یا بیشتر را حذف کنید.
1 2 3 | cleanedDocuments = removeShortWords(cleanedDocuments,2); cleanedDocuments = removeLongWords(cleanedDocuments,15); cleanedDocuments(1:10) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | ans = 10×1 tokenizedDocument: 6 tokens: items occasionally get stuck scanner spool 7 tokens: loud rattle bang sound come assembler piston 4 tokens: cut power start plant 3 tokens: fry capacitor assembler 3 tokens: mixer trip fuse 6 tokens: burst pipe constructing agent spray coolant 3 tokens: fuse blow mixer 5 tokens: thing continue tumble off belt 4 tokens: fall item conveyor belt 6 tokens: scanner reel split soon begin curve |
ایجاد مدل بسته از کلمات
یک مدل بسته ای از کلمات را ایجاد کنید.
1 | cleanedBag = bagOfWords(cleanedDocuments) |
1 2 3 4 5 6 7 | cleanedBag = bagOfWords with properties: Counts: [480×352 double] Vocabulary: [1×352 string] NumWords: 352 NumDocuments: 480 |
کلماتی که بیش از دو بار در مدل بسته ای کلمات ظاهر نمی شوند را حذف کنید.
1 | cleanedBag = removeInfrequentWords(cleanedBag,2) |
1 2 3 4 5 6 7 | cleanedBag = bagOfWords with properties: Counts: [480×163 double] Vocabulary: [1×163 string] NumWords: 163 NumDocuments: 480 |
برخی از مراحل پیش پردازش مانند removeInfrequentWords اسناد را در مدل بسته ای کلمات خالی می گذارد. برای اطمینان از اینکه پس از پیش پردازش، هیچ سند خالی در مدل بسته ای از کلمات باقی نمی ماند، از removeEmptyDocuments به عنوان آخرین مرحله استفاده کنید. همچنین اسناد خالی را از مدل بسته ای کلمات و برچسب های مربوطه را از برچسب ها حذف کنید.
1 2 3 | [cleanedBag,idx] = removeEmptyDocuments(cleanedBag); labels(idx) = []; cleanedBag |
1 2 3 4 5 6 7 | cleanedBag = bagOfWords with properties: Counts: [480×163 double] Vocabulary: [1×163 string] NumWords: 163 NumDocuments: 480 |
ایجاد تابع پیش پردازش
ایجاد تابعی که پیش پردازش را انجام می دهد، می تواند مفید باشد تا بتوانید مجموعه های مختلف داده های متنی را به روشی مشابه آماده کنید. به عنوان مثال، می توانید از یک تابع استفاده کنید تا بتوانید داده های جدید را با استفاده از مراحل مشابه داده های آموزشی از قبل پردازش کنید. تابعی ایجاد کنید که داده های متنی را نشانه گذاری و پیش پردازش می کند تا بتوان از آن برای تجزیه و تحلیل داده ها استفاده کرد. تابع preprocessText مراحل زیر را انجام می دهد:
- فهرستی از کلمات توقف مانند “and” ، “off” و “the” را با استفاده از removeStopWords حذف کنید.
- کلمات را با استفاده از normalizeWords یکنواخت کنید.
- با استفاده از erasePunctuation علائم نگارشی را پاک کنید.
- کلمات دارای 2 کاراکتر یا کمتر را با استفاده از removeShortWords حذف کنید.
- کلمات دارای 15 کاراکتر یا بیشتر را با استفاده از removeLongWords حذف کنید.
از مثال تابع پیش پردازش (preprocessText) برای تهیه داده های متنی استفاده کنید.
1 2 | newText = "The sorting machine is making lots of loud noises."; newDocuments = preprocessText(newText) |
1 2 3 4 | newDocuments = tokenizedDocument: 6 tokens: sorting machine make lot loud noise |
مقایسه با داده های خام
داده های از پیش پردازش شده را با داده های خام مقایسه کنید.
1 2 | rawDocuments = tokenizedDocument(textData); rawBag = bagOfWords(rawDocuments) |
1 2 3 4 5 6 7 | rawBag = bagOfWords with properties: Counts: [480×555 double] Vocabulary: [1×555 string] NumWords: 555 NumDocuments: 480 |
کاهش داده ها را محاسبه کنید.
1 2 3 | numWordsCleaned = cleanedBag.NumWords; numWordsRaw = rawBag.NumWords; reduction = 1 - numWordsCleaned/numWordsRaw |
1 | reduction = 0.7063 |
داده های خام و دادخ های پاک شده را با تجسم دو مدل بسته ای کلمات با استفاده از ابرهای کلمه ای مقایسه کنید.
1 2 3 4 5 6 7 | figure subplot(1,2,1) wordcloud(rawBag); title("Raw Data") subplot(1,2,2) wordcloud(cleanedBag); title("Cleaned Data") |
تابع پیش پردازش
تابع preprocessText مراحل زیر را به ترتیب انجام می دهد:
- با استفاده از tokenizedDocument متن را قطعه بندی کنید.
- فهرستی از کلمات توقف مانند “off” ، “and” و “the” را با استفاده از removeStopWords حذف کنید.
- کلمات را با استفاده از normalizeWords یکنواخت کنید.
- با استفاده از erasePunctuation علائم نگارشی را پاک کنید.
- کلمات دارای 2 کاراکتر یا کمتر را با استفاده از removeShortWords حذف کنید.
- کلمات دارای 15 کاراکتر یا بیشتر را با استفاده از removeLongWords حذف کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function documents = preprocessText(textData) % Tokenize the text. documents = tokenizedDocument(textData); % Remove a list of stop words then lemmatize the words. To improve % lemmatization, first use addPartOfSpeechDetails. documents = addPartOfSpeechDetails(documents); documents = removeStopWords(documents); documents = normalizeWords(documents,'Style','lemma'); % Erase punctuation. documents = erasePunctuation(documents); % Remove words with 2 or fewer characters, and words with 15 or more % characters. documents = removeShortWords(documents,2); documents = removeLongWords(documents,15); end |
نکته پایانی: این مقاله آموزشی متلب از مثال های آماده خود نرم افزار MATLAB است که شما می توانید با تایپ دستور زیر در پنجره کامند متلب به این کدها و دستورات دسترسی داشته باشید.
1 | openExample('textanalytics/PrepareTextDataForAnalysisExample') |
منبع: mathworks
هیچ نظری ثبت نشده است