코드 샘플 보기: awesome-dotnet-fba/015-ikvm-mvn-korean-nlp/Program.cs at main · rkttu/awesome-dotnet-fba · GitHub
이전에 IKVM을 이용하여 Maven 패키지와 JAR 패키지를 불러다 쓰는 방법을 설명했던 아티클이 있었습니다.
- C#으로 KoNLPy 활용하기 (feat. Embeddable Python) - rkttu 님의 게시물 #6
- .NET에서 Maven 패키지나 JAR 파일 직접 참조하기 (feat. IKVM)
이것도 File-based App으로 옮길 수 있다면 효과적이면서도 멋질 것이라고 생각해서 옮겨봤는데 당연하게도 잘 작동합니다.
일단 IKVM.Maven.Sdk nuget 패키지를 참조하고, 아래처럼 코드를 작성합니다.
#!/usr/bin/env dotnet
#:property PublishAot=False
// IKVM Maven SDK integration - allows direct usage of Maven packages in .NET
#:package IKVM.Maven.Sdk@1.9.4
// Import Korean text processing utilities from different Java libraries
using KkmaHangul = org.snu.ids.ha.util.Hangul; // KKMA (Korean Knowledge Morpheme Analyzer)
using OktHangul = org.openkoreantext.processor.util.Hangul; // Open Korean Text processor
// Example 1: Using KKMA to decompose Korean character
var kkma = new KkmaHangulUtil();
// Split the Korean character '한' (han) into its constituent parts
kkma.Split('\uD55C', out var initial, out var medial, out var final);
Console.WriteLine($"Initial: {initial}, Medial: {medial}, Final: {final}");
// Example 2: Using Open Korean Text to compose Korean character
var okt = new OktHangulUtil();
// Combine Korean jamo characters to form a complete syllable
Console.WriteLine($"{okt.Combine('\u3131', '\u3161', '\u3139')}");
// Interface defining common operations for Korean text processing
public interface IHangulUtil
{
// Split a Korean syllable into its constituent jamo (consonant/vowel) parts
void Split(char c, out char onset, out char vowel, out char coda);
// Combine individual jamo characters into a complete Korean syllable
char Combine(char onset, char vowel, char coda);
}
// Implementation using KKMA (Korean Knowledge Morpheme Analyzer) library
public sealed class KkmaHangulUtil : IHangulUtil
{
public void Split(char c, out char onset, out char vowel, out char coda)
{
// Use KKMA's split method to decompose Korean character
var result = KkmaHangul.split(c);
onset = result.cho; // Initial consonant (초성)
vowel = result.jung; // Medial vowel (중성)
coda = result.jong; // Final consonant (종성)
}
public char Combine(char onset, char vowel, char coda)
// Use KKMA's combine method to create Korean syllable from jamo parts
=> KkmaHangul.combine(onset, vowel, coda);
}
// Implementation using Open Korean Text processor library
public sealed class OktHangulUtil : IHangulUtil
{
public void Split(char c, out char onset, out char vowel, out char coda)
{
// Use OKT's decomposeHangul method to break down Korean character
var result = OktHangul.decomposeHangul(c);
onset = result.onset(); // Initial consonant
vowel = result.vowel(); // Medial vowel
coda = result.coda(); // Final consonant
}
public char Combine(char onset, char vowel, char coda)
// Use OKT's composeHangul method to build Korean syllable from components
=> OktHangul.composeHangul(onset, vowel, coda);
}
그리고 실제로 참조하려는 JAR 패키지와 Maven 패키지 정보는 Directory.Build.props 파일에 아래처럼 작성합니다.
<Project>
<ItemGroup>
<IkvmReference Include="kkma-2.0.jar" />
<MavenReference Include="org.openkoreantext:open-korean-text" Version="2.3.1" />
</ItemGroup>
</Project>
JAR 파일의 경우, Program.cs 파일이 있는 위치에 나란히 가져다 놓으면 자동으로 인식되는 점은 동일합니다.
이 접근 방법이 정말 멋진 점은, 당연하게도 JAR와 Maven 패키지 인텔리센스가 아래 그림처럼 바로 작동한다는 점입니다.
IKVM이 타겟팅하는 JVM 버전은 아주 최신 버전은 아니고 Java SE 8 수준이지만, 한글 형태소 분석기 같은 컴포넌트를 .NET에서 가져다 쓰는데에는 큰 무리가 없는 수준이라고 볼 수 있을 것 같습니다.