
비정형 텍스트 데이터를 주석, 유형 시스템 및 모듈식 분석 엔진으로 처리하고 강화하는 분석 파이프라인을 구축하기 위한 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 JRE가 아닌 Java JDK로 실행해야 합니다.
지원되는 플랫폼: Windows, Linux, macOS. 다른 Java 플랫폼 구현도 작동하지만 충분히 테스트되지 않았습니다.
/bin 디렉토리의 많은 스크립트는 Java를 호출합니다. 환경 변수 JAVA_HOME의 값을 사용하여 사용할 Java를 찾습니다. 설정되지 않은 경우 PATH 변수에서 적절한 Java를 찾을 것으로 기대하며 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를 정의합니다.
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의 모든 주석을 반복하여 화면에 출력합니다. 여기에는 UIMA가 항상 생성하는 기본 DocumentAnnotation과 우리가 직접 생성한 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 컴포넌트 구성은 일반적으로 XML 설명자 파일을 생성하여 런타임에 컴포넌트를 인스턴스화하고 배포하는 방법을 프레임워크에 알리는 방식으로 이루어집니다. 이러한 XML 설명자 파일은 설명하는 컴포넌트의 Java 구현과 매우 밀접하게 연결되어 있습니다. 특히 코드 리팩토링이 매우 빈번할 때 두 가지를 일관되게 유지하는 것이 매우 어렵다는 것을 알게 되었습니다. uimaFIT는 UIMA 컴포넌트를 설명하는 Java 어노테이션을 제공하여 코드에서 직접 UIMA 컴포넌트를 설명하는 데 사용할 수 있습니다. 이를 통해 컴포넌트 정의 리팩토링(예: 구성 매개변수 이름 변경)이 크게 간소화됩니다. 또한 코드 생성과 병행하여 수동으로 수행하는 대신 빌드 주기의 일부로 XML 설명자 파일을 생성할 수 있습니다. uimaFIT는 또한 UIMA 컴포넌트의 프로그래밍/동적 인스턴스화를 허용하는 여러 편의 팩토리 메서드를 제공하여 XML 설명자 파일을 전혀 사용하지 않고도 UIMA 컴포넌트를 쉽게 인스턴스화할 수 있게 해줍니다. 이로 인해 uimaFIT는 UIMA 컴포넌트 테스트에 이상적인 라이브러리입니다. 먼저 설명자 파일을 생성할 필요 없이 컴포넌트를 쉽게 인스턴스화하고 호출할 수 있기 때문입니다. uimaFIT는 파이프라인의 프로그래밍/동적 인스턴스화가 실험을 단순화할 수 있는 연구 환경에서도 유용합니다. 예를 들어, 여러 실험 조건에 걸쳐 10-겹 교차 검증을 수행할 때 각 실행마다 다른 설명자 파일 세트를 생성하거나 이러한 설명자 파일을 생성하는 스크립트를 만드는 것은 상당히 힘들 수 있습니다. uimaFIT는 유형 시스템에 구애받지 않으며 특정 유형 시스템에 의존하지 않거나 제공하지 않습니다.
uimaFIT는 UIMA를 위한 팩토리, 주입 및 테스트 유틸리티를 제공하는 라이브러리입니다. 다음 목록은 uimaFIT가 제공하는 일부 기능을 강조합니다:
팩토리: 설명자 파일 없이 프로그래밍 방식으로 UIMA 컴포넌트를 쉽게 인스턴스화합니다. 예를 들어, AnalysisEngine을 인스턴스화하기 위해 다음과 같이 호출할 수 있습니다:
AnalysisEngineFactory.createEngine(MyAEImpl.class, myTypeSystem,
paramName1, paramValue2,
paramName2, paramValue2,
...)
주입: 구성 매개변수 값을 분석 엔진의 해당 멤버 변수에 바인딩하고 외부 리소스의 바인딩을 처리합니다. 예를 들어, 구성 매개변수를 바인딩하려면 멤버 변수에 @ConfigurationParameter 어노테이션을 붙이기만 하면 됩니다. 외부 리소스도 마찬가지로 @ExternalResource 어노테이션을 통해 주입할 수 있습니다. 그런 다음 초기화 메서드에 한 줄의 코드를 추가하십시오:
ConfigurationParameterInitializer.initialize(this, uimaContext).
uimaFIT JCasAnnotator_ImplBase 클래스를 확장하면 자동으로 처리됩니다.
테스트: uimaFIT는 문서에 설명된 여러 가지 방법으로 테스트를 단순화합니다. 설명자 파일 없이 컴포넌트를 쉽게 인스턴스화함으로써 유지 관리가 어렵고 불필요한 XML을 테스트 코드에서 대량 제거할 수 있습니다. 이는 테스트를 더 쉽게 작성하고 유지 관리할 수 있게 해줍니다. 또한, 컴포넌트를 파이프라인으로 실행하는 것은 다음과 같은 메서드 호출로 수행할 수 있습니다:
SimplePipeline.runPipeline(reader, ae1, ..., aeN, consumer1, ... consumerN)
uimaFIT는 Apache UIMA(TM) 프로젝트의 일부입니다. uimaFIT는 호환되는 버전의 Apache UIMA SDK Java 버전과 함께만 사용할 수 있습니다. 편의를 위해 uimaFIT의 바이너리 배포 패키지에는 uimaFIT를 사용하는 데 필요한 모든 라이브러리가 포함되어 있습니다. 특히 초보 사용자의 경우 별도로 전체 UIMA SDK 사본을 확보하는 것이 좋습니다.
uimaFIT는 Maven Central을 통해 사용할 수 있습니다. 빌드 환경에 Maven을 사용하는 경우 다음과 같이 pom.xml 파일에 uimaFIT를 종속성으로 추가할 수 있습니다:
<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을 추출하거나 저장소를 클론한 후, 생성된 디렉토리로 변경하여 다음 명령을 실행하십시오: