Khai thác văn bản: làm thế nào để phân cụm các văn bản (ví dụ như các bài báo) với trí tuệ nhân tạo?


15

Tôi đã xây dựng một số mạng thần kinh (MLP (được kết nối đầy đủ), Elman (định kỳ)) cho các tác vụ khác nhau, như chơi trò chơi điện tử, phân loại chữ số viết tay và công cụ ...

Ngoài ra, tôi đã cố gắng xây dựng một số mạng thần kinh tích chập đầu tiên, ví dụ như để phân loại các ghi chú viết tay nhiều chữ số, nhưng tôi hoàn toàn mới để phân tích và phân cụm văn bản, ví dụ như trong các tác vụ nhận dạng / phân cụm hình ảnh, người ta có thể dựa vào đầu vào được tiêu chuẩn hóa, như hình ảnh có kích thước 25x25, RGB hoặc thang độ xám, v.v ... có rất nhiều tính năng giả định trước.

Để khai thác văn bản, ví dụ như các bài báo, bạn có kích thước đầu vào luôn thay đổi (các từ khác nhau, các câu khác nhau, độ dài văn bản khác nhau, ...).

Làm thế nào người ta có thể thực hiện một công cụ khai thác văn bản hiện đại sử dụng trí tuệ nhân tạo, tốt nhất là mạng thần kinh / SOM?

Thật không may, tôi không thể tìm thấy các hướng dẫn đơn giản để bắt đầu. Các bài báo khoa học phức tạp rất khó đọc và không phải là lựa chọn tốt nhất để học một chủ đề (theo ý kiến ​​của tôi). Tôi đã đọc khá nhiều bài viết về MLP, kỹ thuật bỏ học, mạng nơ ron tích chập, v.v., nhưng tôi không thể tìm thấy một bài cơ bản về khai thác văn bản - tất cả những gì tôi thấy là quá cao đối với kỹ năng khai thác văn bản rất hạn chế của tôi.

Câu trả lời:


12

Latent Dirichlet Allocation (LDA) là tuyệt vời, nhưng nếu bạn muốn thứ gì đó tốt hơn sử dụng mạng thần kinh, tôi sẽ đề xuất doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ).

Những gì nó làm? Nó hoạt động tương tự như word2vec của Google nhưng thay vì một vectơ đặc trưng của một từ, bạn có được một vectơ đặc trưng cho một đoạn văn. Phương pháp này dựa trên mô hình bỏ qua gram và mạng nơ ron và được coi là một trong những phương pháp tốt nhất để trích xuất một vectơ đặc trưng cho tài liệu.

Bây giờ được cho rằng bạn có vectơ này, bạn có thể chạy phân cụm k-nghĩa (hoặc bất kỳ thuật toán thích hợp nào khác) và phân cụm kết quả.

Cuối cùng, để trích xuất các vectơ đặc trưng, ​​bạn có thể thực hiện dễ dàng như vậy:

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
Có vẻ như trong tài liệu NLP, LDA đề cập đến Phân tích Dirichlet tiềm ẩn. Trong tài liệu này, Phân tích phân biệt tuyến tính tìm thấy không sử dụng?
Sid

Chính xác, LDA là Phân bổ Dirichlet tiềm ẩn trong trường hợp của chúng tôi.
Yannis Assael

5

Ngoài LDA, bạn có thể sử dụng Phân tích ngữ nghĩa tiềm ẩn với K-Means . Nó không phải là mạng nơ-ron, mà là cụm "cổ điển", nhưng nó hoạt động khá tốt.

Ví dụ trong sklearn (lấy từ đây ):

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)

Bây giờ nhãn gán cụm có sẵn trong km.labels_

Ví dụ: đây là những chủ đề được trích xuất từ ​​20 nhóm tin tức với 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

Bạn cũng có thể áp dụng Hệ số ma trận không âm , có thể được hiểu là phân cụm. Tất cả những gì bạn cần làm là lấy thành phần lớn nhất của mỗi tài liệu trong không gian được chuyển đổi - và sử dụng nó làm phân công cụm.

Trong sklearn:

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

Làm thế nào bạn có được các từ hàng đầu cho mỗi cụm?
Mayukh Nair

3

LSA + KMeans hoạt động tốt nhưng bạn phải nhập số lượng cụm bạn đang mong đợi. Hơn nữa, hệ số bóng của các cụm được tìm thấy thường thấp.

Một phương pháp khác mà tôi nhận được kết quả tốt hơn là sử dụng ví dụ DBSCAN tại đây . Nó tìm kiếm các trung tâm có mật độ cao và mở rộng để tạo thành các cụm. Trong phương pháp này, nó tự động tìm thấy số lượng cụm tối ưu.

Tôi cũng thấy rất quan trọng khi sử dụng một trình phát gốc, chẳng hạn như Snowball cho ex, giúp giảm các lỗi do lỗi chính tả. Một danh sách các từ dừng tốt cũng rất quan trọng nếu bạn muốn chắc chắn loại bỏ một số cụm không có ý nghĩa vì sự xuất hiện cao của các từ phổ biến không có ý nghĩa quan trọng. Khi bạn xây dựng ma trận đếm của mình, việc chuẩn hóa cũng rất quan trọng, nó cho phép thêm trọng số cho một từ có độ xuất hiện thấp trên tập dữ liệu, nhưng với tỷ lệ xuất hiện cao trong các mẫu cụ thể. Những từ này có ý nghĩa và bạn không muốn bỏ lỡ chúng. Nó cũng làm giảm trọng lượng của các từ có số lần xuất hiện cao trong tất cả các mẫu cụ thể (gần với từ dừng nhưng đối với các từ có thể có một chút ý nghĩa). Một điều cuối cùng tôi nhận thấy là quan trọng không phải là in 10 từ hàng đầu trong cụm của bạn, mà là một lựa chọn mở rộng hơn. Thông thường, chất lượng và mức độ liên quan của các từ khóa đối với nhãn bạn sẽ cung cấp cho cụm có xu hướng giảm đáng kể sau 10-20 từ hàng đầu này. Vì vậy, một cái nhìn mở rộng về các từ khóa hàng đầu sẽ giúp bạn phân tích nếu cụm của bạn thực sự có liên quan hoặc rất ô nhiễm bởi tiếng ồn.


2

Phương pháp yêu thích của tôi là LDA ; bạn có thể tìm ở đây cho một hướng dẫn sử dụng các gói python.

Bạn cũng có thể xem các phương pháp đơn giản hơn nhiều như thế này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.