
Java SDK لبناء خطوط أنابيب التحليلات التي تعالج وتُثري بيانات النصوص غير المنظمة باستخدام التعليقات التوضيحية، وأنظمة الأنواع، ومحركات التحليل المعيارية.
يساعدك [Apache UIMA][UIMA] في إدارة البيانات غير المنظمة (مثل النصوص) المثراة بمعلومات مفيدة. على سبيل المثال، إذا أردت تحديد ذكر لكيان في نص أو ربط ذلك الكيان بمجموعة بيانات مرجعية، فإن Apache UIMA يوفر:
لاحظ أن Apache UIMA Java SDK يوفر فقط إطارًا لبناء التحليلات لكنه لا يقدم أي تحليلات. ومع ذلك، هناك العديد من الأطراف الثالثة التي تبني على Apache UIMA وتوفر مجموعات من مكونات التحليل أو حلولًا جاهزة.
يتطلب Apache UIMA v3.6.0 والإصدارات الأحدث Java إصدار 17 أو أحدث.
يتطلب تشغيل أدوات المكوّن الإضافي Eclipse الخاص بـ UIMA تشغيل Eclipse 4.25 (2022-09) أو أحدث باستخدام Java 17 أو أحدث.
يتطلب تشغيل أداة الترحيل على ملفات الفئات استخدام Java JDK وليس Java JRE.
الأنظمة الأساسية المدعومة هي: Windows وLinux وmacOS. قد تعمل تطبيقات منصة Java الأخرى ولكنها لم تُختبر بشكل كبير.
العديد من البرامج النصية في دليل /bin تستدعي Java. تستخدم قيمة متغير البيئة JAVA_HOME لتحديد موقع Java المطلوب استخدامها؛ وإذا لم يكن معينًا، فإنها تستدعي java متوقعةً العثور على Java مناسبة في متغير PATH الخاص بك.
يمكنك إضافة Apache UIMA Java SDK إلى مشروعك بسهولة في معظم أدوات البناء عن طريق استيراده من [Maven Central][MAVEN-CENTRAL]. على سبيل المثال، إذا كنت تستخدم 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);
الآن ننشئ كائن Common Analysis Structure (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);
الآن، ننشئ تعليقًا توضيحيًا من النوع my.Entity لتحديد ذكر Apache UIMA في النص المثال.
أخيرًا، نمرّ على جميع التعليقات التوضيحية في 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());
}
عادةً ما يتم تكوين مكونات UIMA عن طريق إنشاء ملفات واصف (descriptor) XML تخبر الإطار في وقت التشغيل كيف يجب إنشاء المكونات ونشرها. ترتبط ملفات واصف XML هذه ارتباطًا وثيقًا جدًا بتنفيذ Java للمكونات التي تصفها. وجدنا أنه من الصعب جدًا الحفاظ على اتساق الاثنين مع بعضهما البعض خاصة عندما يكون إعادة هيكلة الكود متكررًا جدًا. توفر uimaFIT تعليقات توضيحية بلغة Java لوصف مكونات UIMA والتي يمكن استخدامها لوصف مكونات UIMA مباشرة في الكود. هذا يبسط إلى حد كبير إعادة هيكلة تعريف المكوّن (على سبيل المثال، تغيير اسم معامل الإعداد). كما يجعل من الممكن إنشاء ملفات واصف XML كجزء من دورة البناء بدلاً من القيام بها يدويًا بالتوازي مع إنشاء الكود. كما تسهّل uimaFIT إنشاء مثيلات لمكونات UIMA دون استخدام ملفات واصف XML إطلاقًا من خلال توفير عدد من طرق المصانع الملائمة التي تسمح بالإنشاء البرمجي/الديناميكي لمكونات UIMA. وهذا يجعل uimaFIT مكتبة مثالية لاختبار مكونات UIMA لأنه يمكن بسهولة إنشاء المكوّن واستدعائه دون الحاجة إلى إنشاء ملف واصف أولاً. uimaFIT مفيدة أيضًا في البيئات البحثية حيث يمكن للإنشاء البرمجي/الديناميكي لخط أنابيب أن يبسّط التجارب. على سبيل المثال، عند إجراء تحقق متقاطع بعشرة أضعاف عبر عدد من الظروف التجريبية، قد يكون إنشاء مجموعة مختلفة من ملفات واصف لكل تشغيل أو حتى برنامج نصي يولد ملفات الواصف هذه أمرًا شاقًا للغاية. uimaFIT محايدة تجاه نظام الأنواع ولا تعتمد على (أو توفر) نظام أنواع محدد.
uimaFIT هي مكتبة توفر المصانع (factories) والحقن (injection) والأدوات المساعدة للاختبار لـ UIMA. تسلط القائمة التالية الضوء على بعض الميزات التي توفرها uimaFIT:
المصانع: تبسّط إنشاء مثيلات لمكونات UIMA برمجيًا دون ملفات واصف. على سبيل المثال، لإنشاء محرك تحليل (AnalysisEngine) يمكن إجراء استدعاء مثل هذا:
AnalysisEngineFactory.createEngine(MyAEImpl.class, myTypeSystem,
paramName1, paramValue2,
paramName2, paramValue2,
...)