<jupyter_start><jupyter_text>ใน ep นี้ เราจะมาเรียนรู้ พื้นฐาน NLP เรื่อง Stop Words ว่า Stop Words คืออะไร ทำไมต้องมี Stop Words  0. Install and Import Library<jupyter_code># ! pip install -U spacy
# ! pip install -U spacy-lookups-data
# ! python -m spacy download en_core_web_sm
from sklearn.feature_extraction import stop_words
import spacy
import numpy as np<jupyter_output><empty_output><jupyter_text>1. Stop Words คืออะไร Stop Words คือ คำทั่ว ๆ ไป ที่เราพบบ่อย ๆ ในประโยค หรือ เอกสาร แต่ไม่ค่อยช่วยในการสื่อความหมายสักเท่าไร ทำให้เราสามารถลบคำเหล่านั้นออกไปจากรายการคำศัพท์ได้เลย กรองทิ้งไปจากเอกสารได้เลย เช่น a, an, the, also, just, quite, unless, etc. คำเหล่านี้เรียกว่า Stop Wordsในสมัยก่อน Deep Learning เป็นที่นิยม นักวิจัยมักจะใช้วิธี Hand Engineer กับข้อมูล ในงาน NLP จะมีการเขียนโปรแกรมผูก Logic กฏระเบียบ ไวยากรณ์ ไว้หลายอย่างในโปรแกรม มีการตัดสินใจกำหนด Assumption / Bias หลายอย่าง หนึ่งในนั้นคือ Stop Words ตามรายการที่กำหนด สามารถตัดทิ้งได้ ไม่สำคัญกับความหมายของเนื้อหา ทำให้ลดความซับซ้อนของโปรแกรมลงแนวโน้มในการใช้ Stop Word เริ่มตั้งแต่ สมัยก่อนนิยมใช้ Stop Word จำนวนมาก 200-300 คำ ลดลงเรื่อย ๆ มาเป็น 7-12 คำ ไปจน ยุค Deep Learning ไม่ใช้ Stop Words เลย เช่น Web Search Engine เช่น Google ไม่ใช้ Stop Words  2. List of Stop Words รายการ Stop Words จะแตกต่างกันไปตามแต่ละ Library ตามแต่ Assumption ของผู้สร้าง Library นั้น ๆ ในตัวอย่างนี้ เราจะดู Library ที่เป็นที่นิยม 2 ตัว ในงาน NLP คือ scikit-learn (NLTK) และ spacy  2.1 scikit-learn (NLTK) มี Stop Words 318 คำ<jupyter_code>len(stop_words.ENGLISH_STOP_WORDS)<jupyter_output><empty_output><jupyter_text>ตัวอย่าง Stop Words จำนวน 20 คำแรก เรียงตามตัวอักษร<jupyter_code>sorted(list(stop_words.ENGLISH_STOP_WORDS))[:20]<jupyter_output><empty_output><jupyter_text>2.2 Spacy<jupyter_code>nlp = spacy.load("en_core_web_sm")<jupyter_output><empty_output><jupyter_text>Spacy มีรายการ Stop Words 326 คำ<jupyter_code>len(nlp.Defaults.stop_words)<jupyter_output><empty_output><jupyter_text>ตัวอย่าง Stop Words จำนวน 20 คำแรก เรียงตามตัวอักษร<jupyter_code>sorted(list(nlp.Defaults.stop_words))[:20]<jupyter_output><empty_output><jupyter_text>2.3 Difference between scikit-learn (NLTK) and spacy Stop Words คำไหนบ้าง ที่มีใน Spacy แต่ไม่มีใน scikit-learn (NLTK)<jupyter_code># type(nlp.Defaults.stop_words), type(stop_words.ENGLISH_STOP_WORDS)
x = nlp.Defaults.stop_words - stop_words.ENGLISH_STOP_WORDS
len(x), x<jupyter_output><empty_output><jupyter_text>Stop Words คำไหนบ้าง ที่มีใน scikit-learn (NLTK) แต่ไม่มีใน Spacy<jupyter_code>x = stop_words.ENGLISH_STOP_WORDS - nlp.Defaults.stop_words
len(x), x<jupyter_output><empty_output><jupyter_text>Stop Words คำไหนบ้าง ที่ปรากฎ ทั้งใน scikit-learn (NLTK) และ Spacy<jupyter_code>x = np.intersect1d(list(stop_words.ENGLISH_STOP_WORDS), list(nlp.Defaults.stop_words))
len(x), x<jupyter_output><empty_output><jupyter_text>3. ข้อดี ของการใช้ Stop Words 1. ทำให้ข้อมูลเล็กลง ความซับซ้อนลดลง1. โปรแกรมทำงานได้เร็วขึ้น1. ประมวลผลไม่ยาก แค่ Look up คำ Stop Words จาก Stop List ที่กำหนดได้เลยStop Words เหมาะกับโมเดลที่ไม่ซับซ้อนมากนัก  4. ข้อเสีย ของการใช้ Stop Words 1. ใช้รายการ Stop Words ไหนดี1. ไม่มีการสนใจ Context ตัดทิ้งทุกกรณี1. ความหมายหายไป เพราะจริง ๆ แล้ว Stop Words ก็มีความหมาย โดยเฉพาะอย่างยิ่ง เมื่อผสมกับคำที่อยู่รอบ ๆ Stop Words ไม่เหมาะกับโมเดลที่ซับซ้อนมาก ๆ อย่าง Deep Neural Network การใช้ Stop Words ทำให้ Performance ตก  Credit * https://github.com/fastai/course-nlp* https://nlp.stanford.edu/IR-book/html/htmledition/dropping-common-terms-stop-words-1.html<jupyter_code><jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12935182564392866, 'fraction_numerical': 0.012170959524483441, 'mean_word_length': 8.275590551181102, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 41, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '291489', 'license': 'MIT', 'n_tokens_mistral': 2200, 'n_tokens_neox': 2262, 'n_words': 290, 'path': 'nbs/26a_stop_words.ipynb', 'repo_name': 'gnoparus/bualabs', 'size': '3533'}