การทำเหมืองข้อความ: วิธีจัดกลุ่มข้อความ (เช่นบทความข่าว) ด้วยปัญญาประดิษฐ์ได้อย่างไร


15

ฉันได้สร้างเครือข่ายนิวรัล (MLP (เชื่อมต่อเต็ม), Elman (กำเริบ) สำหรับงานที่แตกต่างกันเช่นการเล่นโป่ง, การจำแนกตัวเลขหลักที่เขียนด้วยลายมือและสิ่งต่าง ๆ ...

นอกจากนี้ฉันพยายามสร้างโครงข่ายประสาทเทียมแบบแรกเช่นสำหรับการจำแนกบันทึกย่อที่เขียนด้วยลายมือหลายหลัก แต่ฉันใหม่สมบูรณ์ในการวิเคราะห์และจัดกลุ่มข้อความเช่นในการรับรู้ภาพ / การจัดกลุ่มงานหนึ่งสามารถพึ่งพาอินพุตมาตรฐานเช่นรูปภาพขนาด 25x25 RGB หรือเฉดสีเทาและอื่น ๆ ... มีคุณสมบัติมากมายที่คาดการณ์ไว้ล่วงหน้า

สำหรับการทำเหมืองข้อความตัวอย่างเช่นบทความข่าวคุณมีขนาดของการป้อนข้อมูลที่เปลี่ยนแปลงตลอดเวลา (คำต่าง ๆ ประโยคที่แตกต่างความยาวข้อความที่แตกต่างกัน ... )

เราจะใช้เครื่องมือขุดข้อความที่ทันสมัยโดยใช้ปัญญาประดิษฐ์โดยเฉพาะอย่างยิ่งโครงข่ายประสาทเทียม / SOM ได้อย่างไร?

น่าเสียดายที่ฉันไม่สามารถหาบทแนะนำง่าย ๆ สำหรับการเริ่มต้นได้ เอกสารทางวิทยาศาสตร์ที่ซับซ้อนยากที่จะอ่านและไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับการเรียนรู้หัวข้อ (ตามความเห็นของฉัน) ฉันได้อ่านบทความเกี่ยวกับ MLPs, เทคนิคการออกกลางคัน, โครงข่ายประสาทเทียมและอื่น ๆ แล้ว แต่ฉันไม่สามารถหาพื้นฐานเกี่ยวกับการทำเหมืองข้อความได้ - ทั้งหมดที่ฉันพบนั้นอยู่ในระดับที่สูงเกินไปสำหรับทักษะการทำเหมืองข้อความที่ จำกัด

คำตอบ:


12

Latent Dirichlet Allocation (LDA) ยอดเยี่ยม แต่ถ้าคุณต้องการสิ่งที่ดีกว่าที่ใช้โครงข่ายประสาทเทียมฉันขอแนะนำ doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ) อย่างยิ่ง

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

ตอนนี้เมื่อคุณมีเวกเตอร์นี้คุณสามารถเรียกใช้การจัดกลุ่ม k-mean (หรืออัลกอริทึมที่นิยมอื่น ๆ ) และจัดกลุ่มผลลัพธ์

ในที่สุดเมื่อต้องการแยกเวกเตอร์คุณลักษณะคุณสามารถทำได้ง่ายเหมือนที่:

from gensim.models import Doc2Vec
from gensim.models.doc2vec import LabeledSentence

class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename
    def __iter__(self):
        for uid, line in enumerate(open(self.filename)):
            yield LabeledSentence(words=line.split(), labels=['TXT_%s' % uid])


sentences = LabeledLineSentence('your_text.txt')

model = Doc2Vec(alpha=0.025, min_alpha=0.025, size=50, window=5, min_count=5,
                dm=1, workers=8, sample=1e-5)

model.build_vocab(sentences)

for epoch in range(500):
    try:
        print 'epoch %d' % (epoch)
        model.train(sentences)
        model.alpha *= 0.99
        model.min_alpha = model.alpha
    except (KeyboardInterrupt, SystemExit):
        break

2
ดูเหมือนว่าในวรรณคดี NLP LDA หมายถึงการวิเคราะห์ Dirichlet แฝง ในเอกสารนี้การวิเคราะห์จำแนกเชิงเส้นไม่พบการใช้งาน?
Sid

แน่นอน LDA คือการปันส่วน Dirichlet แฝงในกรณีของเรา
Yannis Assael

5

นอกเหนือจาก LDA คุณสามารถใช้แฝงการวิเคราะห์ความหมายกับK-หมายถึง มันไม่ใช่เครือข่ายประสาท แต่เป็นการจัดกลุ่มแบบ "คลาสสิค" แต่ก็ใช้งานได้ดี

ตัวอย่างใน sklearn (นำมาจากที่นี่ ):

dataset = fetch_20newsgroups(subset='all', shuffle=True, random_state=42)
labels = dataset.target
true_k = np.unique(labels).shape[0]

vectorizer = TfidfTransformer()
X = vectorizer.fit_transform(dataset.data)

svd = TruncatedSVD(true_k)
lsa = make_pipeline(svd, Normalizer(copy=False))

X = lsa.fit_transform(X)

km = KMeans(n_clusters=true_k, init='k-means++', max_iter=100)
km.fit(X)

ขณะนี้มีป้ายกำกับการกำหนดคลัสเตอร์พร้อมใช้งานแล้ว km.labels_

ตัวอย่างเช่นนี่คือหัวข้อที่ดึงมาจากกลุ่มข่าว 20 กลุ่มด้วย LSA:

Cluster 0:  space  shuttle  alaska  edu  nasa  moon  launch  orbit  henry  sci
Cluster 1:  edu  game  team  games  year  ca  university  players  hockey  baseball
Cluster 2:  sale  00  edu  10  offer  new  distribution  subject  lines  shipping
Cluster 3:  israel  israeli  jews  arab  jewish  arabs  edu  jake  peace  israelis
Cluster 4:  cmu  andrew  org  com  stratus  edu  mellon  carnegie  pittsburgh  pa
Cluster 5:  god  jesus  christian  bible  church  christ  christians  people  edu  believe
Cluster 6:  drive  scsi  card  edu  mac  disk  ide  bus  pc  apple
Cluster 7:  com  ca  hp  subject  edu  lines  organization  writes  article  like
Cluster 8:  car  cars  com  edu  engine  ford  new  dealer  just  oil
Cluster 9:  sun  monitor  com  video  edu  vga  east  card  monitors  microsystems
Cluster 10:  nasa  gov  jpl  larc  gsfc  jsc  center  fnal  article  writes
Cluster 11:  windows  dos  file  edu  ms  files  program  os  com  use
Cluster 12:  netcom  com  edu  cramer  fbi  sandvik  408  writes  article  people
Cluster 13:  armenian  turkish  armenians  armenia  serdar  argic  turks  turkey  genocide  soviet
Cluster 14:  uiuc  cso  edu  illinois  urbana  uxa  university  writes  news  cobb
Cluster 15:  edu  cs  university  posting  host  nntp  state  subject  organization  lines
Cluster 16:  uk  ac  window  mit  server  lines  subject  university  com  edu
Cluster 17:  caltech  edu  keith  gatech  technology  institute  prism  morality  sgi  livesey
Cluster 18:  key  clipper  chip  encryption  com  keys  escrow  government  algorithm  des
Cluster 19:  people  edu  gun  com  government  don  like  think  just  access

คุณยังสามารถใช้เมทริกซ์ Non-Negative Matrixซึ่งสามารถตีความได้ว่าเป็นการรวมกลุ่ม สิ่งที่คุณต้องทำคือใช้ส่วนประกอบที่ใหญ่ที่สุดของแต่ละเอกสารในพื้นที่แปลงและใช้เป็นการกำหนดคลัสเตอร์

ใน sklearn:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)

คุณได้คำยอดนิยมสำหรับแต่ละคลัสเตอร์ได้อย่างไร
Mayukh Nair

3

LSA + KMeans ทำงานได้ดี แต่คุณต้องป้อนจำนวนของกลุ่มที่คุณคาดหวัง ยิ่งไปกว่านั้นค่าสัมประสิทธิ์เงาของกระจุกที่พบมักอยู่ในระดับต่ำ

วิธีการที่ฉันได้รับผลลัพธ์ที่ดีกว่าก็คือการใช้ DBSCAN ตัวอย่างที่นี่ มันค้นหาศูนย์กลางของความหนาแน่นสูงและขยายเพื่อสร้างกลุ่ม ในวิธีนี้มันจะค้นหาปริมาณที่เหมาะสมโดยอัตโนมัติ

ฉันยังพบว่ามันสำคัญมากที่จะใช้ Stemmer เช่น Snowball สำหรับ ex ซึ่งช่วยลดข้อผิดพลาดเนื่องจากการพิมพ์ผิด รายการคำหยุดที่ดีนั้นสำคัญมากเช่นกันถ้าคุณต้องการให้แน่ใจว่าได้กำจัดกลุ่มบางกลุ่มที่ไม่มีความหมายเพราะมีคำทั่วไปจำนวนมากที่ไม่มีความหมายที่สำคัญ เมื่อคุณสร้างเมทริกซ์การนับการทำให้เป็นมาตรฐานมีความสำคัญเช่นกันมันช่วยให้สามารถเพิ่มน้ำหนักให้กับคำที่มีชุดข้อมูลต่ำ แต่มีการเกิดขึ้นสูงในตัวอย่างเฉพาะ คำเหล่านี้มีความหมายและคุณไม่ต้องการที่จะพลาด นอกจากนี้ยังลดน้ำหนักของคำที่มีเหตุการณ์สูงในตัวอย่างเฉพาะทั้งหมด (ใกล้กับคำที่หยุด แต่สำหรับคำที่มีความหมายเล็กน้อย) สิ่งสุดท้ายที่ฉันสังเกตเห็นคือสิ่งสำคัญคือไม่ควรพิมพ์คำ 10 อันดับแรกของคลัสเตอร์ของคุณ แต่เป็นการเลือกเพิ่มเติมที่กว้างขึ้น โดยทั่วไปคุณภาพและความเกี่ยวข้องของคำหลักที่มีต่อป้ายกำกับที่คุณจะให้กับกลุ่มมีแนวโน้มที่จะลดลงอย่างมากหลังจากคำ 10-20 คำเหล่านี้ ดังนั้นมุมมองเพิ่มเติมของคำหลักยอดนิยมจะช่วยให้คุณวิเคราะห์ว่าคลัสเตอร์ของคุณมีความเกี่ยวข้องหรือมีมลพิษทางเสียงหรือไม่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.