
Java SDK لبناء خطوط أنابيب التحليلات التي تعالج وتُثري بيانات النصوص غير المنظمة باستخدام التعليقات التوضيحية، وأنظمة الأنواع، ومحركات التحليل المعيارية.
يساعدك Apache 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، يمكنك إضافة الاعتماد التالي إلى مشروعك:
<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,
...)
الحقن (Injection): يتولى ربط قيم معاملات الإعداد بالمتغيرات الأعضاء المقابلة في محركات التحليل ويتولى ربط الموارد الخارجية. على سبيل المثال، لربط معامل إعداد، ما عليك سوى وضع تعليق توضيحي على متغير عضو باستخدام @ConfigurationParameter. وبالمثل يمكن حقن الموارد الخارجية عبر التعليق التوضيحي @ExternalResource.
ثم أضف سطرًا واحدًا من الكود إلى طريقة التهيئة الخاصة بك:
ConfigurationParameterInitializer.initialize(this, uimaContext).
يتم التعامل مع هذا تلقائيًا إذا قمت بتمديد فئة uimaFIT JCasAnnotator_ImplBase.
الاختبار: تبسّط uimaFIT الاختبار بعدة طرق موصوفة في التوثيق. من خلال تسهيل إنشاء مثيلات لمكوناتك دون ملفات واصف، يمكن التخلص من كمية كبيرة من XML غير الضرورية والتي يصعب الحفاظ عليها من كود الاختبار الخاص بك. وهذا يجعل كتابة الاختبارات وصيانتها أسهل. أيضًا، يمكن تنفيذ المكونات كخط أنابيب باستدعاء طريقة مثل هذا:
SimplePipeline.runPipeline(reader, ae1, ..., aeN, consumer1, ... consumerN)
uimaFIT هي جزء من مشروع Apache UIMA(TM). لا يمكن استخدام uimaFIT إلا مع إصدار متوافق من إصدار Java الخاص بـ Apache UIMA SDK. ولراحتك، تتضمن حزمة التوزيع الثنائية لـ uimaFIT جميع المكتبات اللازمة لاستخدام uimaFIT. وبالنسبة للمستخدمين المبتدئين بشكل خاص، يُنصح بشدة بالحصول على نسخة من UIMA SDK الكاملة بشكل منفصل.
تتوفر uimaFIT عبر Maven Central. إذا كنت تستخدم Maven في بيئة البناء الخاصة بك، فيمكنك إضافة uimaFIT كاعتماد إلى ملف pom.xml الخاص بك على النحو التالي:
<dependencies>
<dependency>
<groupId>org.apache.uima</groupId>
<artifactId>uimafit-core</artifactId>
<version>3.6.0</version>
</dependency>
</dependencies>
الوحدات
لبناء Apache UIMA، تحتاج على الأقل إلى Java 17 JDK وإصدار حديث من Maven 3.
بعد فك ضغط حزمة توزيع المصدر ZIP أو استنساخ المستودع، انتقل إلى الدليل الذي تم إنشاؤه وشغّل الأمر التالي:
mvn clean install
لمزيد من التفاصيل، يرجى الاطلاع على http://uima.apache.org/building-uima.html
يمكنك تنزيل توزيعات المصدر والثنائية من موقع Apache UIMA.
بعد فك ضغط توزيعة Apache UIMA من الحزمة التي تختارها (مثل .zip أو .gz)، نفّذ الخطوات أدناه لإعداد UIMA ليعمل بشكل صحيح.
عيّن JAVA_HOME إلى دليل تثبيت JRE الذي تريد استخدامه لـ UIMA.
عيّن UIMA_HOME إلى دليل apache-uima لتوزيعة Apache UIMA التي فككت ضغطها
أضف UIMA_HOME/bin إلى PATH
يرجى تشغيل البرنامج النصي UIMA_HOME/bin/adjustExamplePaths.bat (أو .sh) لتحديث المسارات في الأمثلة استنادًا إلى مسار دليل UIMA_HOME الفعلي. يقوم هذا البرنامج النصي بتشغيل برنامج Java؛ يجب أن يكون لديك إما java في PATH أو تعيين متغير البيئة JAVA_HOME إلى JRE مناسب.
ملاحظة: إجراءات نظام التشغيل Mac OS X لإعداد متغيرات البيئة العامة موصوفة هنا: انظر http://developer.apple.com/qa/qa2001/qa1067.html.
لاختبار التثبيت، قم بتشغيل ملف documentAnalyzer.bat (أو .sh) الموجود في الدليل الفرعي bin. يجب أن يظهر إطار Document Analyzer. عيّن القيم المعروضة في هذه الواجهة الرسومية على النحو التالي:
UIMA_HOME/examples/dataUIMA_HOME/examples/data/processedUIMA_HOME/examples/descriptors/analysis_engine/PersonTitleAnnotator.xmlاستبدل UIMA_HOME أعلاه بمسار تثبيت Apache UIMA لديك.
بعد ذلك، انقر فوق الزر Run، وبعد توقف قصير، يجب أن يظهر إطار Analyzed Results. انقر نقرًا مزدوجًا على أحد المستندات لعرض نتائج التحليل لهذا المستند.
فيما يلي قائمة بالعديد من المشاريع المعروفة التي توفر أدوات التحليل الخاصة بها كمكونات UIMA أو التي تغلّف أدوات تحليل تابعة لجهات خارجية كمكونات UIMA:
ليست هذه قائمة شاملة. إذا كنت ترى أن أي مشروع معين يجب إدراجه هنا، فيرجى إخبارنا. يمكنك العثور على مشاريع إضافية على سبيل المثال من خلال:
يمكن استخدام Apache UIMA Java SDK مع أي لغة برمجة قائمة على Java Virtual Machine بما في ذلك Java وGroovy وScala والعديد من اللغات الأخرى.
يمكن تحقيق قابلية التشغيل البيني مع Python على سبيل المثال عبر مكتبة DKPro Cassis التابعة لجهة خارجية والتي يمكن استخدامها لقراءة بيانات CAS ومعالجتها وكتابتها بصيغة XMI.
Apache UIMA Java SDK هو تنفيذ قائم على Java لـ مواصفات UIMA.
يرجى توجيه الأسئلة إلى [email protected].
إذا كنت تستخدم uimaFIT لدعم البحث الأكاديمي، فيرجى التفكير في الاستشهاد بالورقة التالية عند الاقتضاء:
@InProceedings{ogren-bethard:2009:SETQA-NLP,
author = {Ogren, Philip and Bethard, Steven},
title = {Building Test Suites for {UIMA} Components},
booktitle = {Proceedings of the Workshop on Software Engineering, Testing, and Quality Assurance for Natural Language Processing (SETQA-NLP 2009)},
month = {June},
year = {2009},
address = {Boulder, Colorado},
publisher = {Association for Computational Linguistics},
pages = {1--4},
url = {http://www.aclweb.org/anthology/W/W09/W09-1501}
}
أوائل العقد 2000: طُوّرت UIMA في الأصل بواسطة IBM كجزء من الأبحاث حول تحليل المعلومات غير المنظمة (مثل النصوص والصوت والفيديو). صُممت لمعالجة كميات كبيرة من البيانات غير المنظمة بطريقة قابلة للتوسع، مستهدفة تطبيقات معالجة اللغة الطبيعية (NLP).
2004: تم فتح مصدر UIMA، مما سمح باستخدام أوسع ومساهمات من خارج IBM.
2006: تم قبول مشروع UIMA في Apache Incubator، لتبدأ العملية الرسمية ليصبح مشروع Apache.
2008: تخرجت UIMA من Apache Incubator وأصبحت مشروع Apache من المستوى الأعلى، مما يشير إلى نضجها وتطورها النشط.
2009: تم تقديم Apache UIMA-AS (Asynchronous Scaleout)، مما مكّن من المعالجة الموزعة وغير المتزامنة لخطوط أنابيب UIMA.
2012: تمت المساهمة بـ uimaFIT في مشروع Apache UIMA. كانت Apache uimaFIT تُعرف سابقًا باسم uimaFIT، والتي كانت بدورها تُعرف سابقًا باسم UUTUC. قبل المساهمة بها، كانت جهدًا تعاونيًا بين مركز علم الأدوية الحاسوبي في جامعة كولورادو دنفر، ومركز أبحاث اللغة والتعليم الحاسوبي في جامعة كولورادو بولدر، ومختبر Ubiquitous Knowledge Processing (UKP) في جامعة دارمشتات التقنية.
2013: تم تقديم UIMA DUCC (Distributed UIMA Cluster Computing) كمشروع فرعي من Apache UIMA.
2016: تم تقديم Apache UIMA Ruta (Rule-based Text Annotation) كامتداد، مما يوفر لغة برمجة نصية لمعالجة النصوص القائمة على القواعد.
2023: تم إيقاف كل من UIMA DUCC وUIMA-AS.
2024: تم دمج uimaFIT في UIMA Java SDK.