Introduction NLP with spaCy in Software Engineering Part 1

Top'p Kullawattana
14 min readOct 16, 2019

--

ในปัจจุบัน ถ้าเราพูดถึงว่าคำว่า “ภาษาธรรมชาติ” บางคนก็อาจจะมองว่า มันคืออะไร? แต่ถ้าผมจะลองยกตัวอย่างว่า มันคือภาษาที่เราใช้พูดกันนั้นแหละ บางคนก็อาจจะพอเข้าใจ

ปัญหาของการศึกษาภาษานั้นก็มีความซับซ้อนอยู่พอสมควร เนื่องจากทุกวันนี้ เราใช้ภาษาในหลากหลายระดับการสื่อสาร เช่น การใช้ภาษาในงานวิชาการ การใช้ภาษาในการพูดคุยทั่วไป ซึ่งในทุกวันนี้ เราก็ใช้ภาษาผสมกันปนกันไปมาจนแยกแยะไม่ออกอยู่แล้วว่า ภาษาไหน เป็นภาษาทางการหรือไม่ทางการ ซึ่งในภาษาอังกฤษจะเรียกว่า Formal กับ Informal Language

หัวข้อที่น่าสนใจในการวิเคราะห์ภาษาธรรมชาติ (NLP) มีดังนี้

  • Noun phrase extraction
  • Part-of-speech tagging
  • Sentiment analysis
  • Classification (Naive Bayes, Decision Tree)
  • Language translation and detection powered by Google Translate
  • Tokenization (splitting text into words and sentences)
  • Word and phrase frequencies
  • Parsing
  • n-grams
  • Word inflection (pluralization and singularization) and lemmatization
  • Spelling correction
  • Add new models or languages through extensions
  • WordNet integration

กระบวนการประมวลผลภาษาธรรมชาติ (NLP)

ในทางวิศวกรรมซอฟต์แวร์ ได้นำหลักการประมวลผลภาษาธรรมชาติ (Natural Language Processing) ซึ่งเป็นหลักการในการวิเคราะห์โครงสร้างภาษาหรือการตีความทางภาษา ถูกนำมาใช้ในงานวิศวกรรมความต้องการของซอฟต์แวร์ หรือ Requirement Engineering ซึ่งเป็นศาสตร์อีกแขนงหนึ่งในงานวิศวกรรมซอฟต์แวร์ ซึ่งมีความน่าสนใจอยู่หลายประการ

การประมวลผลข้อความ (Text Preprocessing)

ข้อมูลดิบ ประกอบด้วย ค่าตัวเลข เครื่องหมายวรรคตอน อักขระพิเศษ ฯลฯ ดังแสดงในรูปที่ 1 และรูปที่ 2 ค่าเหล่านี้สามารถขัดขวางประสิทธิภาพของแบบจำลองได้ ดังนั้น ก่อนที่จะใช้การแปลข้อความใด ๆ ก่อนอื่นเราต้องแปลงข้อมูลดิบเป็นข้อมูลที่มีความหมาย ซึ่งเรียกว่า เป็นการประมวลผลข้อความล่วงหน้า ซึ่งสามารถทำได้โดยทำตามวิธีต่อไปนี้

1. การลบข้อมูลที่ถูกรบกวน (Remove Noisy Data)

ในประโยคปกติข้อมูลที่มี Noisy สามารถกำหนดเป็นส่วนหัวของไฟล์ข้อความส่วนท้าย, HTML, XML, ข้อมูลมาร์กอัป เนื่องจากข้อมูลประเภทนี้ไม่มีความหมายและไม่ได้ให้ข้อมูลใด ๆ ดังนั้นจึงจำเป็นต้องลบข้อมูลที่มี Noisy ประเภทนี้ ใน python HTML, XML สามารถลบได้โดย Library BeautifulSoup ในขณะที่มาร์กอัปส่วนหัวสามารถลบออกได้โดยใช้นิพจน์ทั่วไป

2. การประมวลผลโทเค็น (Tokenization)

ใน tokenization เราแปลงกลุ่มประโยคเป็นโทเค็น มันจะเรียกว่าการแบ่งส่วนข้อความหรือการวิเคราะห์คำศัพท์ โดยทั่วไปแล้วการแยกข้อมูลออกเป็นคำเล็ก ๆ ตัวอย่างเช่น เรามีประโยค “Ross 128 is earth like planet.Can we survive in that planet?” หลังจาก tokenization ประโยคนี้จะกลายเป็น [‘Ross’, ‘128’, ‘is’, ‘earth’, ‘like’, ‘planet’, ‘.’, ‘Can’, ‘we’, ‘survive’, ‘in’, ‘that’, ‘planet’, ‘?’] tokenization ใน python สามารถทำได้โดยฟังก์ชัน word_tokenize () ของ Library NLTK ของ python

3. การประมวลผลข้อความทั่วไป (Normalization)

ก่อนที่จะทำการทำให้เป็นมาตรฐาน ก่อนอื่นให้สังเกตผลลัพธ์ของโทเค็น เอาต์พุตโทเค็นจะถือว่าเป็นผลลัพธ์สุดท้ายหรือไม่ เราสามารถดึงข้อมูลที่มีความหมายมากขึ้นจากข้อมูลโทเค็นได้หรือไม่ ซึ่งใน tokenaization เราพบคำต่าง ๆ เช่น เครื่องหมายวรรคตอน (punctuation), หยุดคำ (stop words) (is,in,that,can ฯลฯ ), คำตัวพิมพ์ใหญ่และคำตัวพิมพ์เล็กหลังจาก tokenization เราไม่ได้มุ่งเน้นที่ระดับข้อความ แต่ในระดับคำ ดังนั้น โดยการหยุดการแทรกคำย่อ เราสามารถแปลงโทเค็นคำเป็นคำที่มีความหมายมากขึ้น ตัวอย่างเช่น [‘‘ross’, ‘128’, ‘earth’, ‘like’, ‘planet’, ‘survive’, ‘planet’] เราจะเห็นได้ว่าการลบเครื่องหมายวรรคตอน และลบคำหยุดออกทำให้ข้อมูลมีความหมายมากขึ้น

โดยภาพรวมของการศึกษาการประมวลผลภาษาธรรมชาติในทางวิศวกรรมความต้องการนั้น จะมองอยู่ในหัวข้อต่างๆ ดังนี้

  • Tagger หรือการใส่หมายเหตุประกอบส่วนของแท็กคำ (annotating part of speech tags) ในเอกสาร
  • Dependency parser เป็นส่วนที่สำคัญสำหรับคำอธิบายประกอบการพึ่งพา บนเอกสาร
  • Entity Recognizer สำหรับบันทึกเอนทิตีที่มีชื่อบนเอกสาร
  • Tokenizer สำหรับการแบ่งข้อความ เช่น คำ เครื่องหมายวรรคตอน คำกริยา ฯลฯ
  • Lemmatizer สำหรับการกำหนดรูปแบบพื้นฐานของคำ เช่น บทแทรกสำหรับคำกริยากำลังทำ (lemma for verb doing is do)
  • Matcher และ Phrase Matcher สำหรับการจับคู่รูปแบบของคำตามกฏ

เครื่องมือที่ใช้ในการพัฒนางานวิจัย

  • Natural Language Toolkit (NLTK): The complete toolkit for all NLP techniques.
  • TextBlob — Easy to use nlp tools API, built on top of NLTK and Pattern.
  • Stanford Core NLP — NLP services and packages by Stanford NLP Group.
  • spaCy — Industrial strength NLP with Python and Cython.
  • Scikit-learn: Machine learning in Python
  • Gensim — Topic Modelling for Humans
  • Pattern — A web mining module for the with tools for NLP and machine learning.
  • Stanford POS (tagger)
  • FrameNet
  • WordNet
  • CoreNLP
  • NLTK (tagger)
  • Bag-of-words
  • VerbNet

ตัวอย่างเครื่องมือ Stanford Core NLP

Stanford CoreNLP Lemmatization

วิธีการติดตั้ง

  • brew update
  • brew install jenv
  • brew cask install java

ให้ Download Download Standford CoreNLP software โดยทำการ Unzip Project ออกมา และ Run คำสั่งใน Terminal

- cd stanford-corenlp-full-2018-02-27

- java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -annotators "tokenize,ssplit,pos,lemma,parse,sentiment" -port 9000 -timeout 30000

Start Stanford Core NLP
Start Stanford Core Web NLP
Stanford CoreNLP Stemming and Lemmatization
การวิเคราะห์ Lemmatization จากประโยค The striped bats were hanging on their feet and ate best fishes โดยแสดงผลด้วย JSON
การวิเคราะห์ Lemmatization โดยผลการ JOIN ตาม Token
การสร้าง Class เพื่อวิเคราะห์ Lemmatization

อีกเครื่องมือที่อยากแนะนำ คือ Open NLP

แบ่งออกเป็นหัวข้อ ดังนี้

1. Introduction

  • General Library Structure
  • Application Program Interface (API). Generic Example
  • Command line interface (CLI)
  • Setting up
  • Generic Example

2. Language Detector

  • Classifying
  • Language Detector Tool
  • Language Detector API
  • Training Tool
  • Training with Leipzig
  • Training API

3. Sentence Detector

  • Sentence Detection Tool
  • Sentence Detection API
  • Sentence Detector Training
  • Training Tool
  • Training API
  • Evaluation Tool

4. Tokenizer

  • Tokenization
  • Tokenizer Tools
  • Tokenizer API
  • Tokenizer Training
  • Training Tool
  • Training API
  • Detokenizing API
  • Detokenizer Dictionary

5. Name Finder

  • Named Entity Recognition
  • Name Finder Tool
  • Name Finder API
  • Name Finder Training
  • Training Tool
  • Training API
  • Custom Feature Generation
  • Evaluation Tool
  • Evaluation API
  • Named Entity Annotation Guidelines

6. Document Categorizer

  • Classifying
  • Document Categorizer Tool
  • Document Categorizer API
  • Training
  • Training Tool
  • Training API

7. Part-of-Speech Tagger

  • Tagging
  • POS Tagger Tool
  • POS Tagger API
  • Training
  • Training Tool
  • Training API
  • Tag Dictionary
  • Evaluation
  • Evaluation Tool

8. Lemmatizer

  • Lemmatizer Tool
  • Lemmatizer API
  • Lemmatizer Training
  • Training Tool
  • Training API
  • Lemmatizer Evaluation

9. Chunker

  • Chunking
  • Chunker Tool
  • Chunking API
  • Chunker Training
  • Training Tool
  • Training API
  • Chunker Evaluation
  • Chunker Evaluation Tool

10. Parser

  • Parser Tool
  • Parsing API
  • Parser Training
  • Training Tool
  • Training API
  • Parser Evaluation
  • Parser Evaluation Tool
  • Evaluation API

11. Coreference Resolution

12. Extending OpenNLP

  • Writing an extension
  • Running in an OSGi container

13. Corpora

  • CONLL
  • CONLL 2000
  • CONLL 2002
  • CONLL 2003
  • Arvores Deitadas
  • Getting the data
  • Converting the data (optional)
  • Training and Evaluation
  • OntoNotes Release 4.0
  • Name Finder Training
  • Brat Format Support
  • Sentences and Tokens
  • Training
  • Evaluation
  • Cross Validation

14. Machine Learning

  • Maximum Entropy
  • Implementation

15. UIMA Integration

  • Running the pear sample in CVD
  • Further Help

16. Morfologik Addon

  • Morfologik Integration
  • Morfologik CLI Tools

17. The Command Line Interface

  • Doccat
  • DoccatTrainer
  • DoccatEvaluator
  • DoccatCrossValidator
  • DoccatConverter
  • Langdetect
  • LanguageDetector
  • LanguageDetectorTrainer
  • LanguageDetectorConverter
  • LanguageDetectorCrossValidator
  • LanguageDetectorEvaluator
  • Dictionary
  • DictionaryBuilder
  • Tokenizer
  • SimpleTokenizer
  • TokenizerME
  • TokenizerTrainer
  • TokenizerMEEvaluator
  • TokenizerCrossValidator
  • TokenizerConverter
  • DictionaryDetokenizer
  • Sentdetect
  • SentenceDetector
  • SentenceDetectorTrainer
  • SentenceDetectorEvaluator
  • SentenceDetectorCrossValidator
  • SentenceDetectorConverter
  • Namefind
  • TokenNameFinder
  • TokenNameFinderTrainer
  • TokenNameFinderEvaluator
  • TokenNameFinderCrossValidator
  • TokenNameFinderConverter
  • CensusDictionaryCreator
  • Postag
  • POSTagger
  • POSTaggerTrainer
  • POSTaggerEvaluator
  • POSTaggerCrossValidator
  • POSTaggerConverter
  • Lemmatizer
  • LemmatizerME
  • LemmatizerTrainerME
  • LemmatizerEvaluator
  • Chunker
  • ChunkerME
  • ChunkerTrainerME
  • ChunkerEvaluator
  • ChunkerCrossValidator
  • ChunkerConverter
  • Parser
  • ParserTrainer
  • ParserEvaluator
  • ParserConverter
  • BuildModelUpdater
  • CheckModelUpdater
  • TaggerModelReplacer
  • Entitylinker
  • EntityLinker
  • Languagemodel
  • NGramLanguageModel

List of Tables

  • Normalizers
  • Feature Generators

การใช้เครื่องมือในการประมวลผลภาษาธรรมชาติ ก็จะมีเครื่องมือที่ใช้ในการประมวลผลโครงสร้างภาษาต่างๆ มากมาย ผมขอยกตัวอย่าง เช่น การประมวลผลภาษาธรรมชาติโดยใช้ spaCy

spaCy เป็นไลบราลีโอเพ่นซอร์สฟรีสำหรับการประมวลผลภาษาธรรมชาติขั้นสูง โดยไลบราลีเขียนด้วยภาษาไพธอน โดย spaCy นั้นสามารถทำงานร่วมกับไลบราลีอื่นได้ เช่น NLTK

Spacy เขียนด้วยภาษา cython (ส่วนต่อขยาย C ของ Python ออกแบบมาเพื่อให้ C มีประสิทธิภาพเข้ากับโปรแกรม python) ดังนั้น จึงเป็นไลบราลีที่ค่อนข้างเร็ว โดย spaCy ให้ API ในการเข้าถึงวิธีการและคุณสมบัติที่สามารถควบคุมโดยการสร้างแบบจำลองการเรียนรู้ของเครื่อง (Machine Learning) และ Deep Learning

SpaCy เป็นไลบราลีโอเพ่นซอร์สสำหรับการประมวลผลภาษาธรรมชาติขั้นสูงในไพธอน โดยถูกออกแบบมาโดยเฉพาะสำหรับการใช้งาน และช่วยสร้างแอพพลิเคชั่นที่ประมวลผลและ “เข้าใจ” ข้อความจำนวนมาก มันสามารถใช้ในการสร้างการดึงข้อมูลหรือระบบความเข้าใจภาษาธรรมชาติหรือข้อความก่อนการประมวลผลสำหรับ Deep Learning คุณสมบัติบางอย่างที่มีให้โดย spaCy คือ Tokenization, การติดแท็กส่วนของคำพูด (PoS), การจำแนกข้อความ และการจดจำเอนทิตีที่มีชื่อ

โครงสร้างข้อมูลของ spaCy (SpaCy Data Structures)

  • SpaCy มาพร้อมกับโครงสร้างข้อมูลดั้งเดิม (primitive data structures) หรือ data containers
  • Doc: เป็นคอนเทนเนอร์ของคำอธิบายประกอบทุกประเภทที่ได้รับจากจากการวิเคราะห์
  • Vocab: เป็นหน่วยเก็บข้อมูลที่ให้การเข้าถึงคำศัพท์และข้อมูลทั่วไปอื่น ๆ ที่แชร์ข้ามภาษา เช่น StringStore (คอนเทนเนอร์สำหรับเก็บสตริงด้วยรหัสแฮช) และ Lexeme objects (กำหนดประเภทของคำ)

การติดตั้งไลบราลี spaCy

สามารถติดตั้ง Spacy, data และ model ได้อย่างง่ายโดยใช้ python package และ tools setup ใช้คำสั่งต่อไปนี้

  • ในกรณีของ Python3 ให้แทนที่ “pip” ด้วย “pip3” ในคำสั่งด้านบน หรือดาวน์โหลดซอร์สและรันคำสั่งต่อไปนี้ python setup.py install
  • ในการดาวน์โหลดข้อมูลและเวอร์ชันทั้งหมด ให้เรียกใช้คำสั่งต่อไปนี้หลังจากการติดตั้ง python -m spacy.en.download all
  • การติดตั้ง spaCy ผ่าน anaconda installation ให้ใช้คำสั่ง conda install -c conda-forge spacy

SpaCy pipeline และ properties

การทำงานของ spacy เริ่มต้นด้วยการสร้างไปป์ไลน์ โดยการโหลดโมเดล ซึ่งบรรจุข้อมูลเกี่ยวกับภาษา คำศัพท์, เวกเตอร์ที่ผ่านการ Train, ไวยากรณ์และเอนทิตี โดยจะโหลดโมเดลเริ่มต้นซึ่งเป็น english-core-web

• import spacy

• nlp = spacy.load(“en”)

โดย Object “nlp” ใช้สำหรับสร้างเอกสาร (create documents) เข้าถึงคำอธิบายประกอบภาษา (access linguistic annotations) และการเข้าถึงคุณสมบัติของการประมวลผลภาษาธรรมชาติ (NLP) ที่แตกต่างกัน มาสร้างเอกสารด้วยการโหลดข้อมูลตัวอักษรในขั้นตอนการทำงาน ตัวอย่างคำสั่งการใช้งาน

• document = unicode(open(filename).read().decode(‘utf8’))

• document = nlp(document)

ตอนนี้เอกสารเป็นส่วนหนึ่งของคลาสของ spacy.english

คุณสมบัติของเอกสาร (หรือโทเค็น) สามารถแสดงรายการโดยใช้คำสั่งต่อไปนี้

• dir(document)

  • >> [ ‘doc’, ‘ents’, … ‘mem’]

สิ่งนี้แสดงคุณสมบัติของเอกสารที่หลากหลาย เช่น โทเค็น, ดัชนีอ้างอิงของโทเค็น, ส่วนหนึ่งของแท็กคำพูด, เอนทิตี, เวกเตอร์, ความเชื่อมั่น (sentiment), คำศัพท์ ฯลฯ ลองสำรวจคุณสมบัติเหล่านี้

Tokenization

spaCy Document ทุกฉบับมีการทำโทเค็นเป็นประโยคและเพิ่มเติมเป็นโทเค็นที่สามารถเข้าถึงได้โดยทำซ้ำ (iterating) เอกสาร

Tokenization of Word
Tokenization With Reference To Original Text

Reference : https://colab.research.google.com/gist/LahiruTjay/ae69fec1d2e5f6cdbfded0a8082728c2/tokenization-with-original-text-spacy.ipynb

การทำ tokenization แทนที่จะเก็บคำศัพท์ไว้เท่านั้น SpaCy ช่วยรักษาช่องว่างด้วย สิ่งนี้มีประโยชน์ เมื่อต้องการแทนที่คำในข้อความต้นฉบับหรือเพิ่มคำอธิบายประกอบ ด้วยโทเค็น ซึ่งถ้าเราใช้ NLTK จะไม่มีทางทราบได้อย่างแน่ชัดว่า คำใดที่โทเค็นอยู่ในข้อความต้นฉบับ แต่ spaCy จะรักษา “ลิงก์” นี้ระหว่างคำและตำแหน่งในข้อความ

Part of Speech Tagging

Part-of-speech tags เป็นคุณสมบัติของคำที่กำหนดโดยการใช้คำในประโยคที่ถูกต้องตามหลักไวยากรณ์ แท็กเหล่านี้สามารถใช้เป็นคุณสมบัติข้อความในการกรองข้อมูลแบบจำลองเชิงสถิติและการแยกวิเคราะห์ตามกฎ

Entity Detection

Spacy ประกอบด้วยโมเดลการจดจำเอนทิตีที่รวดเร็ว ซึ่งสามารถระบุวลี entitiy จากเอกสารได้ โดย Entities สามารถเป็นประเภทต่าง ๆ เช่น คน, สถานที่ องค์กร วันที่ ตัวเลข และอื่น ๆ Entities เหล่านี้สามารถเข้าถึงได้ผ่านคุณสมบัติ “.ents” มาค้นหา named entities จากที่ปรากฏในเอกสาร

Named Entity Recognition (NER)

การรับรู้เอนทิตีที่มีชื่อ (NER) เป็นการดึงข้อมูล (Information Extraction (IE)) ที่ค้นหาและจัดหมวดหมู่เอนทิตีที่ระบุในเนื้อหา เป็นที่รู้จักกันเพียงแค่การระบุเอนทิตี chunking และการแยกเอนทิตี

NER ดำเนินการโดยการติดลาเบลของคำ หรือโทเค็นชื่อวัตถุ “real-world” เช่น บุคคล บริษัท หรือสถานที่ โดยแบบจำลองทางสถิติของ spaCy ได้รับการ Train ให้รู้จักหน่วยงานที่มีชื่อประเภทต่าง ๆ เช่น ชื่อของผู้คน ประเทศ ผลิตภัณฑ์ และอื่น ๆ จากการคาดการณ์ของเอนทิตีเหล่านี้ อาจไม่สมบูรณ์แบบเสมอไป เนื่องจากแบบจำลองทางสถิติอาจไม่ได้รับการ Train ในกรณีเช่นนี้ เราสามารถปรับเวอร์ชันให้เหมาะกับความต้องการ

ตัวอย่างที่ 1 การวิเคราะห์ Named Entity Recognition (NER)
ตัวอย่างที่ 2 การวิเคราะห์ Named Entity Recognition (NER)

การแสดงภาพของเอนทิตี้ (Visualization of NER)

SpaCy จัดให้มีระบบสถิติที่มีประสิทธิภาพเป็นพิเศษสำหรับ NER ใน python ซึ่งสามารถกำหนดป้ายกำกับให้กับกลุ่มของโทเค็นที่ต่อเนื่องกันได้ มันให้รูปแบบเริ่มต้นซึ่งสามารถรับรู้ความหลากหลายของชื่อหรือหน่วยงานที่เป็นตัวเลข ซึ่งรวมถึงบุคคล องค์กร ภาษา เหตุการณ์ ฯลฯ นอกเหนือจากหน่วยงานเริ่มต้นเหล่านี้ spaCy ยังให้เรามีอิสระในการเพิ่มคลาสให้กับรูปแบบ NER โดยการ Train รูปแบบการปรับปรุงด้วยตัวอย่างที่ผ่านการ Train ขึ้นมา

อย่างที่เห็น spaCy สามารถระบุเอนทิตีส่วนใหญ่ได้อย่างถูกต้อง โดยใช้ displaCy ที่สามารถดูเอนทิตีที่ระบุได้

SpaCy Displacy
HTML Script Display Dependency

การประมวลผลข้อมูล (Data Preprocessing Format)

ในการเทรนข้อมูลด้วย spaCy การแปลงข้อมูลสามารถทำได้ โดยให้ข้อมูลที่อยู่ในรูปแบบ. csv เปลี่ยนให้อยู่ในรูปแบบ JSON เพื่อใช้งานใน spaCy และมาฝึกเทรนโมเดล NER ด้วยการเพิ่มเอนทิตีที่กำหนดเอง

Dependency Parsing

การแยกการพึ่งพาของโครงสร้างประโยค (Dependency Parsing) เป็นกระบวนการของการกำหนดการเข้าถึง syntactic dependency labels โดยการพึ่งพาวากยสัมพันธ์ที่อธิบายความสัมพันธ์ระหว่างโทเค็นของแต่ละบุคคล

ไปป์ไลน์การประมวลผล ใช้แบบจำลองทางสถิติ โมเดลเริ่มต้น ประกอบด้วย ตัวแท็กเกอร์ ตัวแยกวิเคราะห ์และเอนทิตีจดจำ แต่ละองค์ประกอบทำการประมวลผลของตัวเองและส่งคืนวัตถุ (Doc) เดียวกัน จากนั้นส่งผ่านไปยังองค์ประกอบถัดไป ซึ่งเราสามารถเพิ่มกระบวนการในไปป์ไลน์ของเราได้

แบบจำลองทางสถิติใช้สำหรับงานส่วนใหญ่ใน spaCy เป็นเครือข่ายประสาทเทียมที่ได้รับการ Train เกี่ยวกับข้อมูลและข้อความจำนวนมาก คอมโพเนนต์การแท็กการแยกวิเคราะห์และการจดจำเอนทิตี ใช้โมเดลสำหรับการทำนาย

spaCy มีเวอร์ชันที่แตกต่างกันสำหรับภาษาที่แตกต่างและสำหรับการใช้งานที่แตกต่างกัน

ตัวแยกวิเคราะห์การพึ่งพา (dependency parser) ยังใช้โมเดลสถิติเพื่อคำนวณเลเบลการพึ่งพาสำหรับโทเค็น

Dependency Parser
  • text → text: ข้อความโทเค็นต้นฉบับ
  • dep_ → dep: ความสัมพันธ์ทางประโยคที่เชื่อมโยง child เข้ากับ header
  • head.text → head text: ข้อความต้นฉบับของหัวโทเค็น
  • head.pos_ → head POS: แท็กส่วนหนึ่งของคำพูด (part-of-speech tag) ของส่วนหัวโทเค็น
  • children tokens: ความสัมพันธ์ทางประโยค (immediate syntactic dependents) ของโทเค็น

Chunking

การแยกคำ (Chunking) เป็นกระบวนการของการแยกวลีคำนามออกจากข้อความ โดย spaCy สามารถระบุ noun phrases (หรือ noun chunks) โดยเราสามารถนึกถึงคำนามเป็น คำนามกับคำที่อธิบายคำนาม นอกจากนี้ยังเป็นไปได้ที่จะระบุและแยกคำนามพื้นฐานที่กำหนด เช่น ในตัวอย่างโค้ดต่อไปนี้ “Tall big tree is in the vast garden” → คำว่า “tall” และ “big” อธิบายคำนาม “tree”และ “vast” อธิบายคำนาม “garden”

  • text → text: คำนามข้อความดั้งเดิม
  • root.text → ข้อความต้นฉบับของคำที่เชื่อมต่อคำนามกับส่วนที่เหลือของการแยกวิเคราะห์
  • root.dep_ → dep dep: ความสัมพันธ์แบบพึ่งพาการเชื่อมต่อ root กับส่วน header
  • root.head.text → ข้อความส่วนหัวของรูท: ข้อความของส่วนหัวของโทเค็นรูท

Sentence Boundary Detection

เป็นกระบวนการในการระบุและแยกข้อความออกเป็นแต่ละประโยค โดยทั่วไปไลบรารี NLP ส่วนใหญ่ใช้วิธีการตามกฎเมื่อได้รับขอบเขตของประโยค

spaCy ใช้การวิเคราะห์การพึ่งพาเพื่อตรวจจับประโยค โดยใช้แบบจำลองทางสถิติ สิ่งนี้มีความแม่นยำมากกว่าวิธีการตามกฎแบบดั้งเดิม

การแบ่งประโยคตามกฎดั้งเดิมจะทำงานกับข้อความที่มีวัตถุประสงค์ทั่วไป แต่อาจไม่ทำงานตามที่ตั้งใจ เมื่อพูดถึงสื่อโซเชียลหรือข้อความสนทนา เนื่องจาก spaCy ใช้วิธีการทำนายความแม่นยำของการแบ่งประโยค จึงมีแนวโน้มสูงขึ้น ด้วยการเข้าถึงคุณสมบัติ Doc.sents ของออบเจ็กต์ Doc เราสามารถรับประโยคได้ตามตัวอย่างโค้ดด้านล่าง

Part-of-Speech (POS) Tagging

การติดแท็ก POS ทำได้โดยการกำหนดประเภทคำให้กับโทเค็น เช่น คำกริยาหรือคำนาม หลังจาก tokenization ข้อความผ่านการแยกวิเคราะห์และการแท็ก ด้วยการใช้แบบจำลองทางสถิติ spaCy สามารถทำนายแท็กหรือลาเบลที่เป็นไปได้มากที่สุดสำหรับโทเค็นในบริบทที่กำหนด

จากโค้ดข้างต้น แอตทริบิวต์ของ Token Object แสดงดังต่อไปนี้

  • text → text: ข้อความคำเดิม
  • pos_ → POS: แท็กส่วนคำพูดอย่างง่าย
  • tag_ → tag: แท็กส่วนคำพูดที่มีรายละเอียด
  • shape_ → shape: รูปร่างคำ — ตัวพิมพ์ใหญ่, เครื่องหมายวรรคตอน, ตัวเลข
  • is_alpha → is alpha: เป็นโทเค็นของอักขระอัลฟา
  • is_stop → is stop: เป็นส่วนโทเค็นของรายการหยุด (part of a stop list) คือ คำที่พบบ่อยที่สุดของภาษา

เราสามารถรับรายละเอียดของ pos_ หรือ tag_ โดยใช้คำสั่งต่อไปนี้

spacy.explain(“NNP”)
# OUTPUT → ‘noun, proper singular’

spacy.explain(“VBD”)
# OUTPUT → ‘verb, past tense’

การวิเคราะห์คำ (Lemmatization)

Lemmatization เป็นกระบวนการของการแปลงคำให้เป็นรูปแบบพื้นฐาน ความแตกต่างระหว่าง stemming และ lemmatization คือ lemmatization พิจารณาบริบทและแปลงคำให้เป็นรูปแบบฐานที่มีความหมายในขณะที่ stemming เพิ่งลบอักขระสองสามตัวสุดท้ายมักจะนำไปสู่ความหมายที่ไม่ถูกต้องและการสะกดคำผิด โดย Lemmatization ค้นหา lemma ของคำหรือ root word ที่พบในพจนานุกรม ตัวอย่างเช่น run, run, running และ ran เป็นรูปแบบของ lexeme เดียวกันทั้งหมดที่มี run เป็น lemma

ตัวอย่างเช่น การย่อคำศัพท์ จะระบุรูปแบบพื้นฐานของ “caring” เป็น “care” อย่างถูกต้องในขณะที่การกั้นจะตัดส่วนของ “ing” และแปลงเป็น car (‘Caring’ -> Lemmatization -> ‘Care’ ing Caring ’-> Stemming ->‘Car’) นอกจากนี้ บางครั้ง คำเดียวกันอาจมี ‘lemma หลายแบบ ดังนั้น ตามบริบทที่ใช้ ควรระบุแท็ก “part-of-speech” (POS) สำหรับคำในบริบทเฉพาะนั้น และแยก lemma ที่เหมาะสม ตัวอย่างของการใช้งานนี้มาในส่วนต่อไปนี้

Word to Vectors Integration

Spacy ให้วิธีการรวมเวกเตอร์ค่าจริง ซึ่งเป็นตัวแทนของข้อมูลความคล้ายคลึงกันแบบกระจาย ใช้เวกเตอร์ GloVe เพื่อสร้างเวกเตอร์ โดย GloVe เป็นอัลกอริทึมการเรียนรู้แบบไม่มีผู้ดูแล (obtaining vector representations) โดยการใช้เวกเตอร์มา สร้างคำ

Word Vectors Similarity

ความคล้ายคลึงกันของเวกเตอร์ของคำ ถูกกำหนดโดยการเปรียบเทียบการแทนค่าเวกเตอร์ของคำ สามารถสร้างเวกเตอร์คำโดยใช้อัลกอริทึม เช่น word2vec

คุณลักษณะนี้ต้องการโมเดลเชิงสถิติด้วย อย่างไรก็ตาม รูปแบบเริ่มต้นจะไม่มาพร้อมกับคำว่าเวกเตอร์ ดังนั้น เราจะต้องดาวน์โหลดโมเดลขนาดใหญ่ขึ้น

คำสั่งต่อไปนี้จะดาวน์โหลดโมเดล python -m spacy download en_core_web_lg

โดยเราสามารถเข้าถึงเวกเตอร์ของคำดังต่อไปนี้ print(nlp.vocab[‘man’].vector)

คำศัพท์ของแบบจำลอง ประกอบด้วย เวกเตอร์สำหรับคำส่วนใหญ่ในภาษา เช่น คำว่า “man”, “vehicle”, และ “school” เป็นคำทั่วไป และสามารถเข้าถึงเวกเตอร์ดังที่แสดงด้านล่าง หากเวกเตอร์ไม่ได้อยู่ในคำศัพท์นั่น หมายความว่า ไม่มีการแสดงเวกเตอร์ ในตัวอย่างข้างต้นคำว่า “jfido” เป็นคำที่มีความหมาย เราสามารถระบุได้คำศัพท์โดยใช้ is_oovattribute หรือไม่

Word Vectors Similarity โดย Install en_core_web_lg Model

spaCy ยังสามารถเปรียบเทียบความคล้ายคลึงกันระหว่างสอง Object และทำนายความคล้ายคลึงกันระหว่าง Doc, Span และ Token Object มีวิธีการที่เรียกว่า .similarity เพื่อคำนวณความคล้ายคลึงกัน

ดังที่เห็นได้จากตัวอย่างด้านล่าง ความคล้ายคลึงกันระหว่าง “laptop” และ “computer” คือ 0.677216 ในขณะที่ความคล้ายคลึงกันระหว่าง “bus” และ “laptop” คือ 0.2695869 โดย Object ที่เกี่ยวข้อง มีคะแนนความคล้ายคลึงกันมากขึ้น ในขณะที่ Object ที่เกี่ยวข้องน้อยกว่า มีคะแนนความคล้ายคลึงต่ำกว่า

spaCy นำเสนออินเทอร์เฟซที่คล้ายคลึงกันสำหรับการสร้างบล็อคตามคำว่า embukment ทั้งหมด: Token, Span, Doc และ Lexeme นี่คือวิธีการใช้อินเทอร์เฟซที่คล้ายคลึงกัน

เราสามารถค้นหาคำที่มีความคล้ายกันจากประโยค (similarity of sentences)

หนึ่งในคุณสมบัติที่ทรงพลังที่สุดของ spacy คือ parser หรือการพึ่งพาอาศัยทางวากยสัมพันธ์ที่รวดเร็วและแม่นยำ ซึ่งสามารถเข้าถึงได้ผ่าน API ที่มีน้ำหนักเบา ตัวแยกวิเคราะห์ยังสามารถใช้สำหรับการตรวจจับขอบเขตประโยค และการแยกวลี ความสัมพันธ์สามารถเข้าถึงได้โดยคุณสมบัติ “.children”, “. root”, “.ancestor” ฯลฯ

Dependency Tree

การคำนวณเวกเตอร์ของคำ (Word Vectors) จะนำไปติดอยู่กับ SpaCy Object ใน Token, Lexeme (โทเค็นที่ไม่ได้มีการจัดเรียง ซึ่งเป็นส่วนหนึ่งของคำศัพท์) ใน Span และ Doc โดย multi-token objects average โดยการอธิบายคำว่าเวกเตอร์ หากคำสองคำเหมือนกัน คำเหล่านั้นจะปรากฏในบริบทที่คล้ายกัน การคำนวณเวกเตอร์คำโดยคำนึงถึงบริบท (surrounding words)

ตัวอย่างเช่น : “man”-”woman” + “queen”=”king”

Vector Similar Calculation

น่าแปลกที่เวกเตอร์คำที่ใกล้ที่สุดในคำศัพท์สำหรับ “man” -“woman” +“queen” ยังคงเป็น“queen” แต่ “king” เป็นไปได้หลายรูปแบบ

การนับจำนวนคำ (Word Count)

เมื่อเรามีโทเค็นแล้วเราสามารถทำการวิเคราะห์ขั้นพื้นฐานในเอกสารของเราได้ มาเริ่มด้วยการนับจำนวนคำง่าย ๆ โดยใช้อ็อบเจ๊กต์ไพธอน

เราสามารถเห็นภาพคำเหล่านี้นับด้วยแผนภูมิแท่ง (simple bar chart)

การสร้าง Document Makeup

การนับจำนวนคำ อาจมีประโยชน์ในบางโอกาส แต่บ่อยครั้งจำเป็นต้องมีการวิเคราะห์ขั้นสูงเพื่อตอบคำถามทางธุรกิจ โดยเฉพาะอย่างยิ่ง เมื่อข้อมูลของเราประกอบด้วย เอกสารมากกว่าหนึ่งเอกสาร เราสามารถสร้างความสำเร็จด้วยการสร้าง Pandas DataFrame ที่มีฟีเจอร์ที่แสดงถึงจำนวนเอกสารที่โทเค็นปรากฎนับจำนวนโทเค็นที่ปรากฏการจัดอันดับของโทเค็นอื่น ๆ เปอร์เซ็นต์ของการ Markup เอกสารทั้งหมด และเปอร์เซ็นต์ของเอกสารที่โทเค็นปรากฏขึ้น

การใช้ dataframe นี้ สามารถสร้างพล็อตการกระจายสะสมที่แสดงว่าอันดับโทเค็นเกี่ยวข้องกับการแต่งหน้าสะสมของเอกสาร (Cumulative makeup of documents)

แผนการกระจายสะสม (Cumulative Distribution Plot)

จากการพล็อตการกระจายแบบสะสม จะเห็นว่า คำที่พบมากที่สุด 16 คำ หลังจากนั้นการแจกแจงจะมีลักษณะเป็นเส้นตรง เราสามารถเห็นเปอร์เซ็นต์การสร้างเอกสาร (document makeup) ของโทเค็น 16 อันดับสูงสุดเหล่านี้ในแผนผังต้นไม้

ตัวอย่าง Tree Plot

ตัวอย่างเหล่านี้แสดงให้เห็นถึงหลักการเบื้องต้นบางประการที่จำเป็นสำหรับการทำความเข้าใจโลกที่ลึกกว่าของ NLP, Tokenization, การนับจำนวนคำ (word counts) และการวิเคราะห์การวิเคราะห์เอกสาร(document makeup analysis) เป็นแนวคิดพื้นฐาน และในขณะที่เราสามารถเขียนไลบรารี NLP ทั้งหมดตั้งแต่เริ่มต้นซึ่งเป็นวิธีที่มีประสิทธิภาพที่สุดในการแก้ปัญหา

การวิเคราะห์ Stopwords

คำต่าง ๆ เช่น “I”, “and”, “of” ฯลฯ แทบจะไม่มีความหมายสำหรับเรา เราเรียกคำที่ไร้ประโยชน์เหล่านี้ว่า “Stopwords” เพราะเราควร “Stop” ตัวเองจากการรวมเข้าด้วยกันในการวิเคราะห์ โดย NLP Library ส่วนใหญ่มีอยู่ใน lists of stop words ที่คำภาษาอังกฤษทั่วไป (common english words) ประกอบด้วย conjunctions, articles, adverbs, pronouns, and common verbs

อย่างไรก็ตามแนวปฏิบัติที่ดีที่สุด คือ การขยาย หรือ กำหนดคำศัพท์ภาษาอังกฤษมาตรฐานเหล่านี้สำหรับการแก้ปัญหา

ตัวอย่างการกำจัด Stopword (Stopword Removal)

Wordnet Lemmatizer

Wordnet เป็นฐานข้อมูลคำศัพท์ขนาดใหญ่ที่เป็นอิสระและเปิดเผยต่อสาธารณชนสำหรับภาษาอังกฤษ โดยมีวัตถุประสงค์เพื่อสร้างความสัมพันธ์เชิงความหมายระหว่างคำ มันมีความสามารถในการสร้างบทแทรก (lemmatization capabilities) ด้วยเช่นกัน และเป็นหนึ่งในบทแทรกที่สั้นและใช้กันมากที่สุด NLTK มีอินเทอร์เฟซให้ แต่ต้องดาวน์โหลดก่อนเพื่อใช้งาน ทำตามคำแนะนำด้านล่างเพื่อติดตั้ง NLTK และดาวน์โหลด wordnet

ในการแทรกคำคุณต้องสร้างอินสแตนซ์ของ WordNetLemmatizer() และเรียกใช้ฟังก์ชัน lemmatize() ในคำเดียว

มาสรุปประโยคง่าย ๆ ก่อนอื่นเราต้อง tokenize ประโยคเป็นคำโดยใช้ nltk.word_tokenize จากนั้นเราจะเรียก lemmatizer.lemmatize() ในแต่ละคำ ซึ่งสามารถทำได้ในรายการความเข้าใจ (for-loop ภายในวงเล็บเพื่อสร้างรายการ)

โค้ดด้านบนเป็นตัวอย่างง่าย ๆ ของการใช้ wordnet lemmatizer กับคำและประโยค สังเกตว่ามันไม่ได้ดีเลย เนื่องจาก “are” ไม่ได้ถูกแปลงเป็น “be” และ “hanging” ไม่ได้ถูกแปลงเป็น “hang” ตามที่คาดไว้ สิ่งนี้สามารถแก้ไขได้ หากเราให้แท็ก “part-of-speech” ที่ถูกต้อง (tag-POS) เป็นอาร์กิวเมนต์ที่สองสำหรับ lemmatize() บางครั้งคำเดียวกัน อาจมีหลายบทแทรกตามความหมายหรือบริบท

อาจเป็นไปไม่ได้ที่จะจัดเตรียมแท็ก POS แบบเชื่อมโยงสำหรับทุกคำสำหรับข้อความขนาดใหญ่ ดังนั้น เราจะหาแท็ก POS ที่ถูกต้องสำหรับแต่ละคำแทน และจับคู่ไปยังอักขระอินพุตที่ WordnetLemmatizer ยอมรับและส่งผ่านเป็นอาร์กิวเมนต์ที่สองเพื่อย่อคำ lemmatize() ดังนั้น วิธีการรับแท็ก POS สำหรับคำที่กำหนด? ใน NLTK สามารถใช้ได้ผ่านเมธอด nltk.pos_tag() มันยอมรับเฉพาะรายการ (list of words) แม้ว่ามันจะเป็นคำเดียว

nltk.pos_tag() ส่งคืน tuple ด้วยแท็ก POS กุญแจสำคัญที่นี่คือการแมปแท็ก POS ของ NLTK กับฟอร์แมต wordnet lemmatizer ที่จะยอมรับ get_wordnet_pos() ฟังก์ชั่นที่กำหนดไว้ด้านล่างทำหน้าที่การทำ Mapping นี้

TextBlob Lemmatizer

TextBlob เป็นไลบราลีที่ใช้งานง่ายตัวหนึ่งเมื่อพูดถึงการสร้างต้นแบบหรือการใช้งาน NLP ทั่วไปที่ขึ้นอยู่กับทั้ง NLTK และรูปแบบและให้ API ตรงไปตรงมามากกับงาน NLP ทั่วไป ในขณะที่ TextBlob ไม่ได้ทำอะไรเป็นพิเศษหรือน่าตื่นเต้น แต่ทำให้การทำงานกับข้อความเป็นไปอย่างสนุกสนานและขจัดอุปสรรคมากมาย ในขณะที่ TextBlob นั้นไม่ใช่ไลบราลีที่เร็วที่สุดหรือสมบูรณ์ที่สุด แต่ก็มีทุกสิ่งที่เราต้องการในรูปแบบที่เข้าถึงได้ง่ายและสามารถจัดการได้ เป็นแพ็คเกจ NLP ที่ทรงพลัง รวดเร็ว และสะดวกสบาย การใช้ Word Object และ TextBlob ค่อนข้างตรงไปตรงมาในการแยกและย่อคำและประโยคตามลำดับ

การสร้างไปป์ไลน์ด้วยตัวเอง (Custom Pipeline)

มาสร้างไปป์ไลน์ที่กำหนดเองที่ต้องใช้หลังจาก tagger pipeline ทำงาน เราต้องการแท็ก POS เพื่อรับ Synset จาก Wordnet

การเปรียบเทียบความแตกต่างระหว่าง spaCy และ NLTK

ความแตกต่างหลักระหว่าง spaCy และ NLTK จุดประสงค์ที่สร้าง NLTK คือ เป็นชุดเครื่องมือสำหรับการเรียนรู้และการทดลองกับ NLP แต่ spaCy ถูกสร้างขึ้นโดยคำนึงถึงความพร้อมในการผลิต โดยมุ่งเน้นที่ประสิทธิภาพเชิงอุตสาหกรรม

NLTK มีอัลกอริทึมให้เลือกมากมายสำหรับงาน กระบวนการคัดเลือกอัลกอริทึมอาจใช้เวลานาน และไม่พึงประสงค์

อย่างไรก็ตาม spaCy ไม่ได้ทำให้เราเลือกอัลกอริทึมที่ถูกต้อง แต่มักจะให้อัลกอริทึมที่ดีที่สุดและมีประสิทธิภาพมากที่สุดสำหรับงานเฉพาะ โดยไม่ต้องเสียเวลา

NLTK ประมวลผลและจัดการสตริงเพื่อดำเนินงาน NLP ซึ่งมีวิธีการสำหรับแต่ละ task-sent_tokenize สำหรับ sentence, tokenizing, pos_tag สำหรับการติดแท็กส่วนของคำพูด ฯลฯ

ในทางกลับกัน SpaCy ปฏิบัติตามวิธีการเชิงวัตถุในการจัดการงานเดียวกัน ข้อความถูกประมวลผลในไปป์ไลน์และเก็บไว้ในวัตถุ และวัตถุนั้นมีคุณลักษณะและวิธีการสำหรับงาน NLP ต่าง ๆ สอดคล้องกับการเขียนโปรแกรมด้วยไพธอน

สุดท้าย…

เดี๋ยวเราค่อยมาต่อกันในพาร์ทต่อไป เรื่องการประมวลผลภาษาธรรมชาติเพื่อสร้าง Software Requirement ในงานวิศวกรรมซอฟต์แวร์ ในระดับที่สูงขึ้นครับ

ตัวอย่าง Clips และฟีเจอร์สำหรับการวิเคราะห์

  • Installation instructions
  • The parser
  • The tokenizer
  • The lemmatizer
  • The PP-attacher
  • Parse trees
  • Clients and servers
  • Configuration
  • Command-line interface
  • Extending MBSP
  • Exporting to XML, NLTK, GraphViz

ตัวอย่าง MBSP และฟีเจอร์สำหรับการวิเคราะห์

  • Indefinite article
  • Pluralization + singularization
  • Comparative + superlative
  • Verb conjugation
  • Quantification
  • Spelling
  • n-grams
  • Parser (tokenizer, tagger, chunker)
  • Parse trees
  • Sentiment
  • Mood & modality
  • WordNet
  • Wordlists

แนะนำศึกษาเพิ่มเติม

-NLP

Natural Language Annotation for Machine Learning โดย James Pustejovsky และ Amber Stubbs

NLP

-NLTK

-Spacy

-Standford CoreNLP

-Deep Learning Model

  • Deep Learning in Natural Language Processing โดย Li Deng และ Yang Liu
  • Deep Learning for Natural Language Processing (Develop Deep Learning Models for Natural Language in Python) โดย Jason Brownlee
  • Deep Learning for Natural Language Processing (Creating Neural Networks with Python) โดย Palash Goyal, Sumit Pandey, Karan Jain
  • Python Deep Learning Projects: 9 projects demystifying neural network and deep learning models for building intelligent systems โดย Matthew Lamons, Rahul Kumar, Abhishek Nagaraja

How to Use JAVA in colab

Stanza: A Python NLP Library for Many Human Languages

Lucene Analysis Process (Extract NLP from HTML Tag)

--

--

Top'p Kullawattana
Top'p Kullawattana

Written by Top'p Kullawattana

Coding stylist, I have experience of 10 years in the design and implementation of enterprise applications.

No responses yet