2012-03-06 13 views
8

मैंने हाल ही में ऑटोलॉजीज के साथ काम करना शुरू कर दिया है और मैं एक ऑटोलॉजी बनाने के लिए प्रोटेज का उपयोग कर रहा हूं जिसे मैं स्वचालित रूप से तारों को वर्गीकृत करने के लिए भी उपयोग करना चाहता हूं।Ontology- आधारित स्ट्रिंग वर्गीकरण

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

अंततः Spain तरह तारों के रूप में CountryName या UE4564 एक PrefixedNumericString होगा वर्गीकृत किया जाना चाहिए: निम्नलिखित एक बहुत ही बुनियादी वर्ग पदानुक्रम को दिखाता है।

हालांकि मुझे यकीन नहीं है कि इस ज्ञान को कैसे मॉडल किया जाए। क्या मुझे सबसे पहले परिभाषित करना होगा कि कोई वर्ण वर्णमाला, संख्यात्मक, आदि है और फिर मौजूदा वर्णों से एक शब्द बनाते हैं या Regexes का उपयोग करने का कोई तरीका है? अब तक मैं केवल String and hasString value "UE4565" जैसे सटीक वाक्यांश के आधार पर तारों को वर्गीकृत करने में कामयाब रहा हूं।

या ऑटोलॉजी में प्रत्येक कक्षा के लिए एक रेगेक्स सुरक्षित करना बेहतर होगा और फिर उन रेगेक्स का उपयोग करके जावा में स्ट्रिंग को वर्गीकृत करना बेहतर होगा?

उत्तर

2

मुझे प्रोटेज के बारे में कुछ भी पता नहीं है, लेकिन आप उन मामलों में से अधिकांश मैच के लिए रेगेक्स का उपयोग कर सकते हैं। देश और शहर के नाम के बीच एकमात्र समस्या अलग-अलग होगी, मैं नहीं देखता कि आप इसे किसी एक की पूरी सूची के बिना कैसे कर सकते हैं।

यहाँ कुछ भाव है कि आप इस्तेमाल कर सकते हैं कर रहे हैं:

  • AlphabeticString:

    ^[A-Za-z]+\z (ASCII) या ^\p{Alpha}+\z (यूनिकोड)

  • AlphaNumericString:

    ^[A-Za-z0-9]+\z (ASCII) या ^\p{Alnum}+\z (यूनिकोड)

  • PrefixedNumericString:

    ^[A-Za-z]+[0-9]+\z (ASCII) या ^\p{Alpha}+\p{N}+\z (यूनिकोड)

  • NumericString:

    ^[0-9]+\z (ASCII) या ^\p{N}+\z (यूनिकोड)

+0

एक स्ट्रिंग शहर का नाम और देश का नाम दोनों हो सकता है (अच्छी तरह से, अवधारणात्मक रूप से अब तक दिए गए तथ्यों पर आधारित)। एक ऑन्टोलॉजी को एकल विरासत की आवश्यकता नहीं होती है। –

2

एक विशेष स्ट्रिंग है एक उदाहरण, इसलिए आपको विशेष के बारे में बुनियादी दावे करने के लिए कुछ कोड की आवश्यकता होगी रुख। उस कोड में नियमित अभिव्यक्तियों का उपयोग हो सकता है। एक बार जब आप उन दावों को प्राप्त कर लेंगे, तो आप उनके बारे में तर्क के लिए अपने ऑटोलॉजी का उपयोग करने में सक्षम होंगे।

कठिन हिस्सा यह है कि आपको यह तय करना होगा कि आप किस स्तर पर मॉडल करने जा रहे हैं। उदाहरण के लिए, क्या आप अलग-अलग पात्रों के बारे में बात करने जा रहे हैं? आप कर सकते हैं, लेकिन यह जरूरी समझदार नहीं है। आपको यह चुनौती भी मिली है कि नकारात्मक जानकारी अजीब है (क्योंकि ऐसे मॉडल का मूल मॉडल अंतर्ज्ञानवादी है, आईआईआरसी) जिसका अर्थ है (उदाहरण के लिए) कि आपको पता चलेगा कि एक स्ट्रिंग में एक संख्यात्मक वर्ण होता है लेकिन यह नहीं कि यह पूरी तरह से संख्यात्मक है। हां, आपको पता चलेगा कि आपके पास कोई दावा नहीं है कि उदाहरण में वर्णमाला वर्ण है, लेकिन आपको नहीं पता होगा कि ऐसा इसलिए है क्योंकि स्ट्रिंग में एक या सिर्फ इसलिए नहीं है क्योंकि किसी ने अभी तक ऐसा नहीं कहा है। यह सामान मुश्किल है!

यदि आप जानते हैं कि आप वास्तव में किस समस्या का समाधान करना चाहते हैं, तो यह एक ऑटोलॉजी लिखना कहीं अधिक आसान है, क्योंकि इससे आपको कम से कम तथ्यों और संबंधों को काम करने की अनुमति मिलती है जो आपको पहले स्थान पर स्थापित करने की आवश्यकता होती है। आखिरकार, संभावित चीजों की एक पूरी दुनिया है जिसे कहा जा सकता है जो सच है लेकिन अप्रासंगिक है ("यदि सूर्य को उसकी टोपी मिल गई है, तो वह खेलने के लिए बाहर आ जाएगा")।

6

एक दृष्टिकोण जो यहां उचित हो सकता है, खासकर अगर ऑटोलॉजी बड़ा/जटिल हो या भविष्य में बदल सकता है, और यह मानते हुए कि कुछ त्रुटियां स्वीकार्य हैं, मशीन लर्निंग है।

एक प्रक्रिया इस दृष्टिकोण का उपयोग की एक रूपरेखा हो सकता है:

  1. एक सुविधा सेट आप प्रत्येक स्ट्रिंग से हासिल कर सकते हैं, अपने सत्तामीमांसा से संबंधित परिभाषित करें (नीचे कुछ उदाहरण)।
  2. तारों और उनकी वास्तविक मिलान श्रेणियों के "ट्रेन सेट" को एकत्रित करें।
  3. प्रत्येक स्ट्रिंग से सुविधाओं को निकालें, और इस डेटा पर कुछ मशीन-लर्निंग एल्गोरिदम को प्रशिक्षित करें।
  4. नए तारों को वर्गीकृत करने के लिए प्रशिक्षित मॉडल का उपयोग करें।
  5. आवश्यकतानुसार अपने मॉडल को रेट या अपडेट करें (उदाहरण के लिए जब नई श्रेणियां जोड़ दी जाती हैं)।

अधिक ठोस रूप से चित्रित करने के लिए, यहां आपके ऑटोलॉजी उदाहरण के आधार पर कुछ सुझाव दिए गए हैं।

कुछ बूलियन विशेषताएं जो लागू हो सकती हैं: क्या स्ट्रिंग एक regexp से मेल खाता है (उदाहरण के लिए Qtax सुझाता है); स्ट्रिंग एक पूर्वनिर्धारित ज्ञात शहर-नाम सूची में मौजूद है; क्या यह ज्ञात देश-नाम सूची में मौजूद है; अपरकेस अक्षरों का अस्तित्व; स्ट्रिंग लम्बाई (बूलियन नहीं), आदि

तो यदि उदाहरण के लिए, आपके पास कुल 8 विशेषताएं हैं: ऊपर वर्णित 4 नियमित अभिव्यक्तियों से मेल करें; और यहां दिया गया अतिरिक्त 4, फिर "स्पेन" का प्रतिनिधित्व किया जाएगा (1,1,0,0,1,0,1,5) (पहले 2 नियमित अभिव्यक्तियों से मेल खाता है लेकिन अंतिम दो नहीं, शहर का नाम है लेकिन देश का नाम नहीं, एक अपरकेस अक्षर और लंबाई 5 है)।

सुविधा का यह सेट किसी दिए गए स्ट्रिंग का प्रतिनिधित्व करेगा।

मशीन लर्निंग एल्गोरिदम को प्रशिक्षित और परीक्षण करने के लिए, आप WEKA का उपयोग कर सकते हैं। मैं नियम या वृक्ष आधारित एल्गोरिदम से शुरू करूंगा, उदा। भाग, रिडोर, जेआरआईपी या जे 48।

तब प्रशिक्षित मॉडल का उपयोग जावा के भीतर या बाहरी कमांड लाइन के रूप में याका के माध्यम से किया जा सकता है।

जाहिर है, मेरे द्वारा सुझाई गई सुविधाओं में आपके Ontology के साथ लगभग 1: 1 मैच है, लेकिन यह मानते हुए कि आपकी वर्गीकरण बड़ी और अधिक जटिल है, यह दृष्टिकोण लागत प्रभावीता के मामले में शायद सबसे अच्छा होगा।

+0

यह एक अच्छा जवाब था जिसे मैंने थोड़ी देर में पढ़ा है! असल में यह इतना अच्छा था कि अब मैं इसे अपने लिए कोशिश करना चाहता हूं। धन्यवाद, etov –

1

सीधे अपने प्रश्न का उत्तर देते हुए, आप यह जांचकर शुरू करते हैं कि दिया गया टोकन संख्यात्मक, अल्फान्यूमेरिक या वर्णमाला है (आप यहां रेगेक्स का उपयोग कर सकते हैं) और फिर आप इसे वर्गीकृत करते हैं। आम तौर पर, जिस दृष्टिकोण को आप ढूंढ रहे हैं उसे टोकन या पदानुक्रमित विशेषता चयन (Google इसे) के सामान्यीकरण पदानुक्रम कहा जाता है। मूल विचार यह है कि आप प्रत्येक टोकन को एक अलग तत्व के रूप में देख सकते हैं, लेकिन यह सबसे अच्छा तरीका नहीं है क्योंकि आप उन्हें सभी [*] को कवर नहीं कर सकते हैं। इसके बजाए, आप टोकन के बीच सामान्य विशेषताओं का उपयोग करते हैं (उदाहरण के लिए, 2000 और 1981 अलग टोकन हैं लेकिन वे 4 अंकों की संख्या और संभवतः वर्षों की एक सामान्य विशेषता साझा करते हैं)।फिर आपके पास चार अंक संख्याओं के लिए एक वर्ग है, दूसरा अल्फान्यूमेरिक के लिए, और इसी तरह। सामान्यीकरण की यह प्रक्रिया आपको अपने वर्गीकरण दृष्टिकोण को सरल बनाने में मदद करती है।

अक्सर, यदि आप टोकन की एक स्ट्रिंग के साथ शुरू करते हैं, तो आपको उन्हें प्रीप्रोसेस करना होगा (उदाहरण के लिए, विराम चिह्न या विशेष प्रतीकों को हटाएं, उन शब्दों को हटाएं जो प्रासंगिक नहीं हैं, स्टेमिंग आदि)। लेकिन हो सकता है कि आप कुछ प्रतीकों का उपयोग कर सकें (कहें, शहरों और देशों के बीच विराम चिह्न - उदाहरण के लिए Melbourne, Australia), इसलिए आप अन्य प्रतीक (#) पर उपयोगी विराम चिह्नों के सेट को असाइन करते हैं और इसे संदर्भ के रूप में उपयोग करते हैं (इसलिए अगली बार जब आप अज्ञात पाते हैं एक ज्ञात देश के बगल में एक अल्पविराम के बगल में शब्द, आप यह ज्ञान मान सकते हैं कि अज्ञात शब्द एक शहर है।

वैसे भी, यह एक ऑटोलॉजी (शर्तों की वर्गीकरण के आधार पर) वर्गीकरण के पीछे सामान्य विचार है। तुम भी part-of-speech tagging के बारे में पढ़ सकते हैं।

वैसे, अगर आप केवल 3 श्रेणियों (संख्यात्मक, अक्षरांकीय, वर्णमाला), एक व्यवहार्य विकल्प edit distance उपयोग करने के लिए (क्या अधिक होने की संभावना है कि UA4E30 संबंधित है होगा करना चाहते हैं एस अल्फान्यूमेरिक या न्यूमेरिक श्रेणी में, यह मानते हुए कि यह प्रीफिक्स्ड न्यूमेरिक तारों के पारंपरिक प्रारूप से मेल नहीं खाता है?)। तो, आप प्रत्येक ऑपरेशन (सम्मिलन, हटाना, प्रतिस्थापन) के लिए एक लागत मानते हैं जो आपके अज्ञात टोकन को किसी ज्ञात में बदल देता है।

अंत में, हालांकि आपने कहा है कि आप अपने ऑटोलॉजी बनाने के लिए प्रोटेज (जिसका उपयोग नहीं किया है) का उपयोग कर रहे हैं, तो आप WordNet देख सकते हैं।

[*] संभाव्य दृष्टिकोण हैं जो अज्ञात टोकन के लिए संभावना निर्धारित करने में आपकी सहायता करते हैं, इसलिए ऐसी घटना की संभावना शून्य नहीं है। आमतौर पर, यह छिपे हुए मार्कोव मॉडल के संदर्भ में किया जाता है। असल में, यह etov द्वारा दिए गए सुझाव को बेहतर बनाने के लिए उपयोगी हो सकता है।