
असंरचित टेक्स्ट डेटा को एनोटेशन, टाइप सिस्टम और मॉड्यूलर विश्लेषण इंजनों के साथ प्रोसेस और समृद्ध करने वाले एनालिटिक्स पाइपलाइनों के निर्माण के लिए Java SDK।
[Apache UIMA][UIMA] आपको असंरचित डेटा (जैसे पाठ) के प्रबंधन में मदद करता है जो उपयोगी जानकारी से समृद्ध होता है। उदाहरण के लिए, यदि आप किसी पाठ में किसी इकाई के उल्लेख की पहचान करना चाहते हैं या संभावित रूप से उस इकाई को किसी संदर्भ डेटासेट से जोड़ना चाहते हैं, तो Apache UIMA प्रदान करता है:
ध्यान दें कि Apache UIMA Java SDK केवल एनालिटिक्स बनाने के लिए एक ढांचा प्रदान करता है, लेकिन यह कोई एनालिटिक्स प्रदान नहीं करता है। हालाँकि, कई तृतीय-पक्ष हैं जो Apache UIMA पर निर्मित होते हैं और विश्लेषण घटकों या तैयार समाधानों के संग्रह प्रदान करते हैं।
Apache UIMA v3.6.0 और बाद के संस्करण के लिए Java संस्करण 17 या बाद का आवश्यक है।
UIMA के लिए Eclipse प्लगइन टूलिंग चलाने के लिए आपको Java 17 या बाद के संस्करण का उपयोग करके Eclipse 4.25 (2022-09) या बाद का संस्करण शुरू करना होगा।
क्लास फ़ाइलों पर माइग्रेशन टूल चलाने के लिए Java JDK की आवश्यकता है, न कि Java JRE की।
समर्थित प्लेटफ़ॉर्म हैं: Windows, Linux, और macOS। अन्य Java प्लेटफ़ॉर्म कार्यान्वयन काम करने चाहिए लेकिन उनका महत्वपूर्ण परीक्षण नहीं किया गया है।
/bin निर्देशिका में कई स्क्रिप्ट Java को आमंत्रित करती हैं। वे उपयोग करने के लिए Java का पता लगाने के लिए पर्यावरण चर JAVA_HOME के मान का उपयोग करते हैं; यदि यह सेट नहीं है, तो वे java को आमंत्रित करते हैं और उम्मीद करते हैं कि आपके PATH चर में एक उपयुक्त Java मिलेगा।
आप [Maven Central][MAVEN-CENTRAL] से आयात करके अधिकांश बिल्ड टूल्स में Apache UIMA Java SDK को आसानी से अपने प्रोजेक्ट में जोड़ सकते हैं। उदाहरण के लिए, यदि आप Maven का उपयोग करते हैं, तो आप अपने प्रोजेक्ट में निम्नलिखित निर्भरता जोड़ सकते हैं:
<dependency>
<groupId>org.apache.uima</groupId>
<artifactId>uimaj-core</artifactId>
<version>3.6.0</version>
</dependency>
आगे, हम Apache UIMA Java SDK और Apache uimaFIT लाइब्रेरी का उपयोग करने के कुछ संक्षिप्त उदाहरण देते हैं। Apache uimaFIT एक अलग निर्भरता है जिसे आप जोड़ सकते हैं:
<dependency>
<groupId>org.apache.uima</groupId>
<artifactId>uimafit-core</artifactId>
<version>3.6.0</version>
</dependency>
प्रकार प्रणाली उस प्रकार की जानकारी को परिभाषित करती है जिसे हम असंरचित जानकारी (यहाँ एक पाठ दस्तावेज़) से जोड़ना चाहते हैं। हमारे उदाहरण में, हम इकाइयों के उल्लेखों की पहचान करना चाहते हैं, इसलिए हम एक प्रकार my.Entity को एक फ़ीचर category के साथ परिभाषित करते हैं जिसका उपयोग संबंधित इकाई की श्रेणी को संग्रहीत करने के लिए किया जा सकता है।
उदाहरण के लिए, UIMA आंतरिक रूप से एनोटेशन स्कीमा के बारे में जो जानकारी बनाए रखता है, उसे स्पष्ट करने के लिए हम उत्पन्न स्कीमा को XML के रूप में स्क्रीन पर लिखते हैं।
String TYPE_NAME_ENTITY = "my.Entity";
String TYPE_NAME_TOKEN = "my.Token";
String FEAT_NAME_CATEGORY = "category";
var tsd = UIMAFramework.getResourceSpecifierFactory().createTypeSystemDescription();
tsd.addType(TYPE_NAME_TOKEN, "", CAS.TYPE_NAME_ANNOTATION);
var entityTypeDesc = tsd.addType(TYPE_NAME_ENTITY, "", CAS.TYPE_NAME_ANNOTATION);
entityTypeDesc.addFeature(FEAT_NAME_CATEGORY, "", CAS.TYPE_NAME_STRING);
tsd.toXML(System.out);
अब हम एक सामान्य विश्लेषण संरचना (CAS) ऑब्जेक्ट बनाते हैं जिसमें हम उस पाठ को संग्रहीत करते हैं जिसका हम विश्लेषण करना चाहते हैं।
फिर से, UIMA CAS ऑब्जेक्ट में आंतरिक रूप से संग्रहीत जानकारी को स्पष्ट करने के लिए, हम ऑब्जेक्ट का एक XML प्रतिनिधित्व स्क्रीन पर लिखते हैं।
var cas = CasFactory.createCas(tsd);
cas.setDocumentText("Welcome to Apache UIMA.");
cas.setDocumentLanguage("en");
CasIOUtils.save(cas, System.out, SerialFormat.XMI_PRETTY);
अब, हम उदाहरण पाठ में Apache UIMA के उल्लेख की पहचान करने के लिए my.Entity प्रकार का एक एनोटेशन बनाते हैं।
अंत में, हम CAS में सभी एनोटेशन पर पुनरावृत्ति करते हैं और उन्हें स्क्रीन पर प्रिंट करते हैं। इसमें डिफ़ॉल्ट DocumentAnnotation शामिल है जो हमेशा UIMA द्वारा बनाया जाता है, साथ ही my.Entity एनोटेशन जो हमने स्वयं बनाया है।
var entityType = cas.getTypeSystem().getType(TYPE_NAME_ENTITY);
var entity = cas.createAnnotation(entityType, 11, 22);
cas.addFsToIndexes(entity);
for (var anno : cas.<Annotation>select(entityType)) {
System.out.printf("%s: [%s]%n", anno.getType().getName(), anno.getCoveredText());
}
विभिन्न प्रकार के विश्लेषण को चरणों में व्यवस्थित करने के लिए, हम आमतौर पर उन्हें अलग-अलग विश्लेषण इंजनों में पैकेज करते हैं। अब हम स्पष्ट करते हैं कि ऐसे घटकों का निर्माण कैसे किया जा सकता है और उन्हें एक विश्लेषण पाइपलाइन के रूप में कैसे निष्पादित किया जा सकता है।
class TokenAnnotator extends CasAnnotator_ImplBase {
public void process(CAS cas) throws AnalysisEngineProcessException {
var tokenType = cas.getTypeSystem().getType(TYPE_NAME_TOKEN);
var bi = BreakIterator.getWordInstance();
bi.setText(cas.getDocumentText());
int begin = bi.first();
int end;
for (end = bi.next(); end != BreakIterator.DONE; end = bi.next()) {
var token = cas.createAnnotation(tokenType, begin, end);
cas.addFsToIndexes(token);
begin = end;
}
}
}
class EntityAnnotator extends CasAnnotator_ImplBase {
public void process(CAS cas) throws AnalysisEngineProcessException {
var tokenType = cas.getTypeSystem().getType(TYPE_NAME_TOKEN);
var entityType = cas.getTypeSystem().getType(TYPE_NAME_ENTITY);
for (var token : cas.<Annotation>select(tokenType)) {
if (Character.isUpperCase(token.getCoveredText().charAt(0))) {
var entity = cas.createAnnotation(entityType, token.getBegin(), token.getEnd());
cas.addFsToIndexes(entity);
}
}
}
}
cas = CasFactory.createCas(tsd);
cas.setDocumentText("John likes Apache UIMA.");
cas.setDocumentLanguage("en");
var pipeline = AnalysisEngineFactory.createEngineDescription(
AnalysisEngineFactory.createEngineDescription(TokenAnnotator.class),
AnalysisEngineFactory.createEngineDescription(EntityAnnotator.class));
SimplePipeline.runPipeline(cas, pipeline);
for (var anno : cas.<Annotation>select(entityType)) {
System.out.printf("%s: [%s]%n", anno.getType().getName(), anno.getCoveredText());
}