2012-03-06 58 views
8

Gần đây tôi đã bắt đầu làm việc với các bản thể luận và tôi đang sử dụng Protege để xây dựng bản thể luận mà tôi cũng muốn sử dụng để tự động phân loại các chuỗi. Sau đây minh họa một hệ thống phân cấp lớp rất cơ bản:Phân loại chuỗi dựa trên Ontology

String 
|_ AlphabeticString 
    |_ CountryName 
    |_ CityName 
|_ AlphaNumericString 
    |_ PrefixedNumericString 
|_ NumericString 

Cuối cùng chuỗi như Spain nên được phân loại như CountryName hoặc UE4564 sẽ là một PrefixedNumericString.

Tuy nhiên, tôi không chắc chắn cách mô hình kiến ​​thức này. Tôi có phải định nghĩa đầu tiên nếu một ký tự là chữ cái, số, vv và sau đó xây dựng một từ từ các ký tự hiện có hoặc có cách nào để sử dụng Regex không? Cho đến nay tôi chỉ quản lý để phân loại các chuỗi dựa trên cụm từ chính xác như String and hasString value "UE4565".

Hoặc sẽ tốt hơn nếu an toàn một regex cho mỗi lớp trong bản thể luận và sau đó phân loại chuỗi trong Java bằng cách sử dụng các regex đó?

Trả lời

2

Tôi không biết gì về Protege, nhưng bạn có thể sử dụng regex để khớp với hầu hết các trường hợp đó. Vấn đề duy nhất sẽ khác biệt giữa tên quốc gia và tên thành phố, tôi không thấy làm thế nào bạn có thể làm điều đó mà không có một danh sách đầy đủ của một trong hai.

Dưới đây là một số biểu hiện mà bạn có thể sử dụng:

  • AlphabeticString:

    ^[A-Za-z]+\z (ASCII) hoặc ^\p{Alpha}+\z (Unicode)

  • AlphaNumericString:

    ^[A-Za-z0-9]+\z (ASCII) hoặc ^\p{Alnum}+\z (Unicode)

  • PrefixedNumericString:

    ^[A-Za-z]+[0-9]+\z (ASCII) hoặc ^\p{Alpha}+\p{N}+\z (Unicode)

  • NumericString:

    ^[0-9]+\z (ASCII) hoặc ^\p{N}+\z (Unicode)

+0

Một chuỗi có thể là cả tên thành phố và tên quốc gia (tốt, khái niệm dựa trên các sự kiện được đưa ra). Một bản thể luận không cần phải có thừa kế đơn lẻ. –

2

Một chuỗi đặc biệt là một ví dụ, vì vậy bạn sẽ cần một số mã để thực hiện các xác nhận cơ bản về đặc biệt trong lập trường. Bản thân mã đó có thể chứa việc sử dụng các biểu thức thông thường. Một khi bạn đã có những xác nhận đó, bạn sẽ có thể sử dụng bản thể luận của bạn để giải thích về chúng.

Phần khó khăn là bạn phải quyết định bạn sẽ lập mô hình ở cấp độ nào. Ví dụ, bạn sẽ nói về các nhân vật cá nhân? Bạn có thể, nhưng nó không nhất thiết phải hợp lý. Bạn cũng có thách thức phát sinh từ thực tế là thông tin tiêu cực là khó xử (vì mô hình cơ bản của các mô hình như vậy là trực giác, IIRC) có nghĩa là (ví dụ) bạn sẽ biết rằng một chuỗi chứa ký tự số nhưng không phải là nó hoàn toàn là số. Có, bạn biết rằng bạn không có xác nhận rằng cá thể chứa ký tự chữ cái, nhưng bạn sẽ không biết đó là vì chuỗi không có hoặc chỉ vì chưa có ai nói vậy. Thứ này thật khó!Nó dễ dàng hơn để viết một bản thể luận nếu bạn biết chính xác những vấn đề bạn định giải quyết với nó, vì điều đó cho phép bạn ít nhất có một đi vào làm việc ra những gì các sự kiện và quan hệ bạn cần phải thiết lập ở nơi đầu tiên. Chúc vui vẻ! Xét cho cùng, có một thế giới đầy đủ những điều có thể nói là đúng nhưng không liên quan (“nếu mặt trời đã đội mũ, anh ấy sẽ ra ngoài chơi”).

6

Phương pháp có thể phù hợp ở đây, đặc biệt nếu bản thể luận lớn/phức tạp hoặc có thể thay đổi trong tương lai và giả định rằng một số lỗi có thể chấp nhận được, là học máy.

Một phác thảo của một quá trình sử dụng phương pháp này có thể là:

  1. Xác định một tính năng thiết lập, bạn có thể trích xuất từ ​​mỗi chuỗi, liên quan đến ontology của bạn (một số ví dụ dưới đây).
  2. Thu thập "bộ tàu" của các chuỗi và danh mục đối sánh thực sự của chúng.
  3. Trích xuất các tính năng từ mỗi chuỗi và đào tạo một số thuật toán học máy trên dữ liệu này.
  4. Sử dụng mô hình được đào tạo để phân loại chuỗi mới.
  5. Đào tạo lại hoặc cập nhật mô hình của bạn nếu cần (ví dụ: khi thêm danh mục mới).

Để minh họa cụ thể hơn, dưới đây là một số đề xuất dựa trên ví dụ bản thể luận của bạn.

Một số tính năng boolean có thể áp dụng: chuỗi có khớp với regexp hay không (ví dụ: các đối tượng địa lý Qtax gợi ý); chuỗi tồn tại trong danh sách tên thành phố đã được dựng trước; nó tồn tại trong một danh sách tên quốc gia đã biết; sự tồn tại của các chữ in hoa; độ dài chuỗi (không boolean), v.v.

Vì vậy, nếu, ví dụ: bạn có tổng cộng 8 đối tượng địa lý: phù hợp với 4 cụm từ thông dụng được đề cập ở trên; và 4 bổ sung được đề xuất ở đây, sau đó "Tây Ban Nha" sẽ được biểu thị là (1,1,0,0,1,0,1,5) (khớp với 2 cụm từ thông dụng đầu tiên nhưng không phải là hai cụm từ cuối cùng, là tên thành phố nhưng không phải tên quốc gia, có chữ hoa và chiều dài là 5).

Bộ tính năng này sẽ đại diện cho bất kỳ chuỗi nhất định nào.

để đào tạo và kiểm tra thuật toán học máy, bạn có thể sử dụng WEKA. Tôi sẽ bắt đầu từ các thuật toán dựa trên quy tắc hoặc dựa trên cây, ví dụ: PART, RIDOR, JRIP hoặc J48.

Sau đó, các mô hình được đào tạo có thể được sử dụng qua Weka hoặc từ bên trong Java hoặc dưới dạng dòng lệnh ngoài. Rõ ràng, các tính năng tôi đề nghị có gần như 1: 1 phù hợp với Ontology của bạn, nhưng giả sử phân loại của bạn là lớn hơn và phức tạp hơn, cách tiếp cận này có lẽ sẽ là một trong những tốt nhất về hiệu quả chi phí.

+0

Đó là câu trả lời hay nhất tôi đã đọc trong một thời gian! Trong thực tế nó đã được như vậy tốt mà bây giờ tôi muốn thử nó ra cho bản thân mình. Cảm ơn, etov –

1

Trả lời trực tiếp câu hỏi của bạn, bạn bắt đầu bằng cách kiểm tra xem mã thông báo đã cho là số, chữ số hoặc chữ cái (bạn có thể sử dụng regex tại đây) và sau đó phân loại nó như vậy. Nói chung, cách tiếp cận bạn đang tìm kiếm được gọi là phân cấp tổng quát về mã thông báo hoặc lựa chọn tính năng phân cấp (Google nó). Ý tưởng cơ bản là bạn có thể coi mỗi mã thông báo là một phần tử riêng biệt, nhưng đó không phải là cách tiếp cận tốt nhất vì bạn không thể bao gồm tất cả [*]. Thay vào đó, bạn sử dụng các tính năng phổ biến trong số các mã thông báo (ví dụ: 20001981 là các mã thông báo riêng biệt nhưng chúng có chung một tính năng gồm 4 chữ số và có thể là năm).Sau đó, bạn có một lớp cho số bốn chữ số, một lớp cho chữ số và vân vân. Quá trình khái quát hóa này giúp bạn đơn giản hóa cách tiếp cận phân loại của mình.

Thông thường, nếu bạn bắt đầu bằng một chuỗi mã thông báo, bạn cần phải xử lý trước chúng (ví dụ, xóa dấu câu hoặc ký hiệu đặc biệt, xóa các từ không liên quan, bắt nguồn, v.v.). Nhưng có thể bạn có thể sử dụng một số ký hiệu (ví dụ: dấu chấm câu giữa các thành phố và quốc gia - ví dụ: Melbourne, Australia), vì vậy bạn chỉ định tập ký hiệu dấu câu hữu ích đó cho biểu tượng khác (#) và sử dụng nó làm ngữ cảnh (vì vậy lần sau bạn tìm thấy từ bên cạnh dấu phẩy bên cạnh một quốc gia đã biết, bạn có thể sử dụng kiến ​​thức đó để giả định rằng từ chưa biết là thành phố. Bạn cũng có thể muốn đọc khoảng part-of-speech tagging.

Bằng cách này, nếu bạn chỉ muốn có 3 danh mục (số, chữ và số, chữ cái), một tùy chọn khả thi sẽ sử dụng edit distance (nhiều khả năng là UA4E30 đó s đến danh mục chữ số hoặc số, xem xét rằng nó không tương ứng với định dạng truyền thống của các chuỗi số được đặt trước?). Vì vậy, bạn giả định một chi phí cho mỗi hoạt động (chèn, xóa, subtitution) mà biến đổi mã thông báo chưa biết của bạn thành một cái đã biết.

Cuối cùng, mặc dù bạn nói rằng bạn đang sử dụng Protege (mà tôi chưa sử dụng) để xây dựng bản thể luận của bạn, bạn có thể muốn xem WordNet.

[*] Có các cách tiếp cận xác suất giúp bạn xác định xác suất cho mã thông báo không xác định, do đó xác suất của sự kiện đó không phải là 0. Thông thường, điều này được thực hiện trong bối cảnh của mô hình Hidden Markov. Trên thực tế, điều này có thể hữu ích để cải thiện đề xuất được đưa ra bởi etov.

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