การแยกชิ้นส่วนและข้อมูล

Chunking คืออะไร?

Chunking เป็นหนึ่งในกระบวนการที่สำคัญในการประมวลผลภาษาธรรมชาติใช้เพื่อระบุส่วนของคำพูด (POS) และวลีสั้น ๆ พูดง่ายๆว่าด้วยการแบ่งชิ้นส่วนเราจะได้โครงสร้างของประโยค เรียกอีกอย่างว่าpartial parsing.

รูปแบบก้อนและรอยแตก

Chunk patternsคือรูปแบบของแท็ก part-of-speech (POS) ที่กำหนดประเภทของคำที่ประกอบขึ้นเป็นกลุ่ม เราสามารถกำหนดรูปแบบกลุ่มโดยใช้นิพจน์ทั่วไปที่แก้ไขได้

นอกจากนี้เรายังสามารถกำหนดรูปแบบของคำประเภทที่ไม่ควรอยู่ในกลุ่มคำและคำที่ไม่เรียงกันเหล่านี้เรียกว่า chinks.

ตัวอย่างการใช้งาน

ในตัวอย่างด้านล่างพร้อมกับผลลัพธ์ของการแยกวิเคราะห์ประโยค “the book has many chapters”, มีไวยากรณ์สำหรับวลีคำนามที่รวมทั้งรูปแบบก้อนและแบบบิ่น -

import nltk
sentence = [
   ("the", "DT"),
   ("book", "NN"),
   ("has","VBZ"),
   ("many","JJ"),
   ("chapters","NNS")
]
chunker = nltk.RegexpParser(
   r'''
   NP:{<DT><NN.*><.*>*<NN.*>}
   }<VB.*>{
   '''
)
chunker.parse(sentence)
Output = chunker.parse(sentence)
Output.draw()

เอาต์พุต

ดังที่เห็นด้านบนรูปแบบในการระบุก้อนคือการใช้วงเล็บปีกกาดังนี้ -

{<DT><NN>}

และเพื่อระบุความผิดปกติเราสามารถพลิกวงเล็บปีกกาได้ดังนี้ -

}<VB>{.

ตอนนี้สำหรับประเภทวลีหนึ่ง ๆ กฎเหล่านี้สามารถรวมกันเป็นไวยากรณ์ได้

การสกัดข้อมูล

เราได้ดำเนินการผ่าน taggers และ parsers ที่สามารถใช้ในการสร้างเครื่องมือดึงข้อมูล ให้เราดูท่อส่งข้อมูลพื้นฐาน -

การสกัดข้อมูลมีหลายโปรแกรม ได้แก่ -

  • ระบบธุรกิจอัจฉริยะ
  • เก็บเกี่ยวต่อ
  • การวิเคราะห์สื่อ
  • การตรวจจับความรู้สึก
  • การค้นหาสิทธิบัตร
  • การสแกนอีเมล

การรับรู้ชื่อเอนทิตี (NER)

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

ตัวอย่าง

Import nltk
file = open (
   # provide here the absolute path for the file of text for which we want NER
)
data_text = file.read()
sentences = nltk.sent_tokenize(data_text)
tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences]
tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences]
for sent in tagged_sentences:
print nltk.ne_chunk(sent)

การรับรู้ชื่อเอนทิตี (NER) ที่แก้ไขแล้วบางรายการยังสามารถใช้เพื่อแยกเอนทิตีเช่นชื่อผลิตภัณฑ์เอนทิตีทางการแพทย์ชีวภาพชื่อแบรนด์และอื่น ๆ อีกมากมาย

การแยกความสัมพันธ์

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

ตัวอย่าง

ในตัวอย่างต่อไปนี้เราใช้ไปป์ไลน์ IE เดียวกันดังที่แสดงในแผนภาพด้านบนที่เราใช้จนถึง Named-entity relationship (NER) และขยายด้วยรูปแบบความสัมพันธ์ตามแท็ก NER

import nltk
import re
IN = re.compile(r'.*\bin\b(?!\b.+ing)')
for doc in nltk.corpus.ieer.parsed_docs('NYT_19980315'):
for rel in nltk.sem.extract_rels('ORG', 'LOC', doc, corpus = 'ieer',
pattern = IN):
print(nltk.sem.rtuple(rel))

เอาต์พุต

[ORG: 'WHYY'] 'in' [LOC: 'Philadelphia']
[ORG: 'McGlashan & Sarrail'] 'firm in' [LOC: 'San Mateo']
[ORG: 'Freedom Forum'] 'in' [LOC: 'Arlington']
[ORG: 'Brookings Institution'] ', the research group in' [LOC: 'Washington']
[ORG: 'Idealab'] ', a self-described business incubator based in' [LOC: 'Los Angeles']
[ORG: 'Open Text'] ', based in' [LOC: 'Waterloo']
[ORG: 'WGBH'] 'in' [LOC: 'Boston']
[ORG: 'Bastille Opera'] 'in' [LOC: 'Paris']
[ORG: 'Omnicom'] 'in' [LOC: 'New York']
[ORG: 'DDB Needham'] 'in' [LOC: 'New York']
[ORG: 'Kaplan Thaler Group'] 'in' [LOC: 'New York']
[ORG: 'BBDO South'] 'in' [LOC: 'Atlanta']
[ORG: 'Georgia-Pacific'] 'in' [LOC: 'Atlanta']

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