2009-07-26 51 views
11

Chuỗi Markov là cách (gần như tiêu chuẩn) để tạo ra random gibberish trông thông minh cho mắt chưa được đào tạo. Làm thế nào bạn sẽ đi về việc xác định markov tạo ra văn bản từ văn bản của con người bằng văn bản.Thuật toán để xác định nội dung do Markov tạo ra?

Sẽ thật tuyệt vời nếu các tài nguyên bạn trỏ đến thân thiện với Python.

Trả lời

6

Bạn có thể sử dụng phương pháp "brute force", theo đó bạn so sánh ngôn ngữ được tạo với dữ liệu được thu thập trên n-grams cao hơn thứ tự so với mô hình Markov đã tạo ra nó.

tức là nếu ngôn ngữ được tạo bằng mô hình Markov thứ 2, tối đa 3 gram sẽ có tần suất chính xác nhưng có thể 4-gram.

Bạn có thể nhận tần suất tối đa 5 gram từ công khai của Google n-gram dataset. Mặc dù rất lớn - 24G được nén - bạn cần tải xuống bằng cách đăng trên DVD từ LDC.

EDIT: Thêm một số chi tiết thực hiện

Các n-gram đã được tính, vì vậy bạn chỉ cần để lưu trữ các đếm (hoặc tần số) trong một cách đó là nhanh chóng để tìm kiếm. Một cơ sở dữ liệu được lập chỉ mục đúng, hoặc có lẽ chỉ mục Lucene sẽ hoạt động.

Cho một đoạn văn bản, quét qua nó và tìm tần suất của mỗi 5 gram trong cơ sở dữ liệu của bạn và xem vị trí của nó so với 5 gram khác bắt đầu bằng 4 từ.

Thực tế, trở ngại lớn hơn có thể là các điều khoản cấp phép của tập dữ liệu. Sử dụng nó cho một ứng dụng thương mại có thể bị cấm.

+0

Tôi thích cách tiếp cận này, nhưng tôi nghĩ điều này sẽ không khả thi về mặt tính toán? – agiliq

+0

Không xem cách thêm một số chi tiết vào câu trả lời. – pufferfish

2

Nếu bạn có nhiều văn bản được tạo bằng Markov lớn, bạn có thể xác định rằng chúng bằng cách so sánh tần số từ giữa mỗi mẫu. Vì chuỗi Markov phụ thuộc vào xác suất từ ​​không đổi, tỷ lệ của bất kỳ từ đã cho nào sẽ gần như bằng nhau từ mẫu đến mẫu.

+0

Nó cũng có thể trả tiền để xem bộ công cụ ngôn ngữ tự nhiên dựa trên python: http://nltk.sourceforge.net/ - nói rằng, nó có thể là một chút quá mức nếu bạn chỉ quan tâm đến tần số từ. – Markus

+1

Nếu tần số từ được tạo ra để trông giống như văn bản thực tế, bạn có thể gặp vấn đề nếu bạn làm việc với tần số của các từ như ... – Janusz

+0

Vấn đề với cách tiếp cận này là nếu văn bản do con người tạo ra và chuỗi tạo chuỗi Markov được tạo từ văn bản với các tần số chuyển đổi từ và từ tương tự, chuỗi văn bản Markov sẽ trông giống như văn bản do con người tạo ra. –

8

Một cách tiếp cận đơn giản là có một nhóm lớn người đọc văn bản đầu vào cho bạn và xem liệu văn bản có hợp lý hay không. Tôi chỉ đùa thôi, đây là một vấn đề phức tạp.

Tôi tin rằng đây là một vấn đề khó khăn, bởi vì chuỗi Markov tạo ra văn bản sẽ có rất nhiều tính chất giống nhau của văn bản thực tế của con người về tần số từ và mối quan hệ đơn giản giữa thứ tự các từ.

Sự khác biệt giữa văn bản thực và văn bản được tạo bởi chuỗi Markov là các quy tắc ngữ pháp cấp cao hơn và ý nghĩa ngữ nghĩa, rất khó mã hóa theo chương trình. Vấn đề khác là các chuỗi Markov đủ tốt để tạo ra văn bản mà đôi khi chúng đưa ra các câu lệnh đúng ngữ pháp và ngữ nghĩa.

Như một ví dụ, đây là một aphorism from the kantmachine:

Hôm nay, anh sẽ cảm thấy bị thuyết phục rằng ý chí của con người là tự do; đến ngày mai, xem xét chuỗi không hòa tan của bản chất, anh ấy sẽ tự do xem như là một ảo ảnh và tự nhiên tuyên bố là tất cả trong tất cả.

Trong khi chuỗi này được viết bởi một chương trình máy tính, thật khó để nói rằng một người sẽ không bao giờ nói điều này.

Tôi nghĩ rằng trừ khi bạn có thể cung cấp cho chúng tôi chi tiết cụ thể hơn về máy tính và văn bản do con người tạo ra để hiển thị sự khác biệt rõ ràng hơn, khó có thể giải quyết vấn đề này bằng lập trình máy tính.

+5

Điều này khá đáng lo ngại, trên thực tế. Tôi đã đọc Critique of Pure Reason (tác phẩm duy nhất của Kant tôi thực sự có thể tự mình đọc/hiểu) và, tôi KHÔNG BAO GIỜ nói rằng câu cách ngôn được tạo ra bằng máy. – shylent

+0

@shylent - đó là lần truy cập thứ tư trên trang, và tôi đồng ý, rất nhiều trong phong cách của Kant. Đây sẽ là một ví dụ rất tốt cho một khóa học liên quan đến chuỗi Markov! –

2

Crowdsourcing. Sử dụng Mechanical Turk và nhận được một số người để bỏ phiếu cho điều này. Thậm chí còn có một số thư viện để giúp bạn gỡ bỏ điều này. Ví dụ:

Dưới đây là một bài viết trên blog từ O'Reilly Radar trên lời khuyên cho việc sử dụng Mechanical Turk để có được công việc của bạn được thực hiện:

5

Tôi đề nghị tổng quát câu trả lời của Evan: tạo ra một mô hình Markov của riêng bạn và đào tạo nó với một đoạn lớn mẫu (rất lớn) bạn được cung cấp, đặt phần còn lại của mẫu là "dữ liệu thử nghiệm". Bây giờ, hãy xem mô hình bạn đã đào tạo tốt như thế nào trên dữ liệu thử nghiệm, ví dụ:với một thử nghiệm chi square sẽ gợi ý tình huống trong đó "fit is TOO good" (cho thấy dữ liệu thử nghiệm thực sự được tạo ra bởi mô hình này) cũng như những dữ liệu phù hợp rất xấu (gợi ý lỗi trong cấu trúc mô hình) mô hình bị đào tạo với cấu trúc sai làm một công việc xấu nổi tiếng trong những trường hợp như vậy). Tất nhiên vẫn còn nhiều vấn đề về hiệu chuẩn, chẳng hạn như cấu trúc của mô hình - bạn nghi ngờ một mô hình đơn giản dựa trên Ntuples các từ và ít hơn, hoặc một mô hình phức tạp hơn với ngữ pháp và tương tự. May mắn thay bạn có thể hiệu chỉnh mọi thứ khá tốt bằng cách sử dụng các tập đoàn lớn của văn bản được biết đến tự nhiên và cũng là những văn bản bạn tự tạo ra với các mô hình cấu trúc khác nhau.

Cách tiếp cận khác là sử dụng nltk để phân tích cú pháp các câu bạn đã đưa ra - một số lượng nhỏ các phân tích sai được mong đợi ngay cả trong văn bản tự nhiên (vì con người không hoàn hảo và phân tích cú pháp - nó có thể không biết từ X có thể được sử dụng như một động từ và chỉ phân loại nó như một danh từ, vv), nhưng hầu hết các mô hình Markov (trừ khi chúng mô hình hóa cơ bản cùng một cấu trúc ngữ pháp mà trình phân tích cú pháp của bạn sử dụng - và bạn có thể sử dụng một số trình phân tích cú pháp để thử và chống lại điều đó! -) sẽ khiến VASTLY phân tích cú pháp sai hơn so với cả con người khó đọc. Một lần nữa, hiệu chỉnh trên văn bản tự nhiên so với tổng hợp và bạn sẽ thấy ý tôi! -)

0

Nếu bạn viết chương trình tạo ra xác suất chuyển đổi Markovian từ bất kỳ dãy ký hiệu nào, và sau đó tính toán tốc độ entropy của ma trận markov. (xem http://en.wikipedia.org/wiki/Entropy_rate#Entropy_rates_for_Markov_chains) Điều này về cơ bản là một ước tính về cách dễ dàng các văn bản có thể được dự đoán bằng cách sử dụng chỉ chuỗi markov (entropy cao hơn có nghĩa là khó hơn để dự đoán). Vì vậy, tôi sẽ nghĩ rằng entropy càng thấp của ma trận markov thì càng có nhiều khả năng mẫu văn bản được điều khiển bởi một ma trận markov. Nếu bạn có câu hỏi về cách viết mã này, tôi tình cờ có một chương trình trong python thực hiện chính xác điều này trên máy tính của tôi, vì vậy tôi có thể giúp bạn trong số

Các vấn đề liên quan