본문 바로가기
C#.Net

한글 형태소 분석

by 호야호잇 2020. 9. 21.

확실히 요즘은 무언가를 개발하거나 테스트해보기에 환경이 너무 좋은 것 같다.

새롭게 시도해보고 싶은 아이디어가 떠올라 구현을 해보고 있는데

필요한 기능중 하나가 바로 문장에서 단어를 구분하여 추출하는 기능이다.

이걸 어떻게 구현해야하나 고민하던 중에 좋은 라이브러리를 찾았다.

(아니 고민은 하지않았지 그냥 바로 검색을했지…)

 

https://github.com/modamoda/TwitterKoreanProcessorCS

트위터에서 제공하는 한국어 형태소 분석기인 twitter-korean-text를 C#에서 사용 가능하도록 wrapping 한 라이브러리다.

 

Visual Studio에서는 Nuget 패키지 관리자에서 직접 프로젝트에 참조해서 쓰면 간편하다.

간단한 예제를 보자면

 

var results = TwitterKoreanProcessorCS.TokenizeToStrings("형태소 분석을 합니닼ㅋㅋㅋㅋㅋㅋ"); Console.WriteLine(string.Join(" / ", results)); // 형태소Noun / 분석Noun / 을Josa / 하다Verb / ㅋㅋKoreanParticle

 

한국어 문장을 넣으면 정의별로 딱딱 분류를 해준다.

아직 테스트를 해보진 않았지만 예제만 봤을땐 억소리나오게 훌륭하다.

당장 필요한 기능에선 관련 없지만 저렇게 잘분류가 된다면

차후 챗봇 같은 서비스를 개발할 때 분명 유용할 것 같다.

 

개발자가 제공해주는 Sample.cs 내용을 보면 라이브러리를 사용하는데 무리가 없을 것 같다.

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Moda.Korean.TwitterKoreanProcessorCS.Sample
  8. {
  9. using Moda.Korean.TwitterKoreanProcessorCS;
  10.  
  11. public class Sample
  12. {
  13. public string NormalizeSample()
  14. {
  15. string result = TwitterKoreanProcessorCS.Normalize("정규화(Normalize) 예제입니당~");
  16.  
  17. // "정규화(Normalize) 예제입니다~"
  18. return result;
  19. }
  20.  
  21. public string TokenizeSample1()
  22. {
  23. StringBuilder result = new StringBuilder();
  24.  
  25. var tokens = TwitterKoreanProcessorCS.Tokenize("토큰화를 처리하는 예제입니다");
  26. foreach (var token in tokens)
  27. {
  28. result.AppendFormat(format: "{0}({1}) [{2},{3}] / ",
  29. args: new object[] { token.Text, token.Pos.ToString(), token.Offset, token.Length });
  30. }
  31.  
  32. // 토큰(ProperNoun) [0,2] / 화(Suffix) [2,1] / 를(Josa) [3,1] / ... / 입니(Adjective) [12,2] / 다(Eomi) [14,1] /
  33. return result.ToString();
  34. }
  35.  
  36. public string TokensToStringsSample1()
  37. {
  38. var tokens = TwitterKoreanProcessorCS.Tokenize("토큰화를 처리하는 예제입니다. 문자열화는 덤");
  39. var results = TwitterKoreanProcessorCS.TokensToStrings(tokens);
  40.  
  41. // 토큰 / 화 / 를 / 처리 / 하는 / 예제 / 입니 / 다 / . / 문자열 / 화 / 는 / 덤
  42. return string.Join(" / ", results);
  43. }
  44.  
  45. public string StemSample1()
  46. {
  47. StringBuilder result = new StringBuilder();
  48.  
  49. var tokens = TwitterKoreanProcessorCS.Tokenize("토큰화 이후 어근화를 처리하는 예제입니다");
  50. var stemmedTokens = TwitterKoreanProcessorCS.Stem(tokens);
  51.  
  52. foreach (var stemmedToken in stemmedTokens)
  53. {
  54. result.AppendFormat(format: "{0}({1}) [{2},{3}] / ",
  55. args: new object[] { stemmedToken.Text, stemmedToken.Pos.ToString(), stemmedToken.Offset, stemmedToken.Length });
  56. }
  57.  
  58. // 토큰(ProperNoun) [0,2] / 화(Suffix) [2,1] / (Space) [3,1] / 이후(Noun) [4,2] / ... / 예제(Noun) [17,2] / 이다(Adjective) [19,3] /
  59. return result.ToString();
  60. }
  61.  
  62. public string ExtractPhraseSample1()
  63. {
  64. StringBuilder result = new StringBuilder();
  65.  
  66. var tokens = TwitterKoreanProcessorCS.Tokenize("토큰화 처리 이후 어구를 추출하는 예제입니당ㅇㅇㅇ");
  67. var phrases = TwitterKoreanProcessorCS.ExtractPhrases(tokens);
  68.  
  69. foreach (var phrase in phrases)
  70. {
  71. result.AppendLine("---------");
  72. result.AppendFormat("{0} | ", phrase.Pos.ToString());
  73. foreach (var token in phrase.Tokens)
  74. {
  75. result.AppendFormat(format: "{0}({1}) [{2},{3}] / ",
  76. args: new object[] { token.Text, token.Pos.ToString(), token.Offset, token.Length });
  77. }
  78. result.AppendLine();
  79. }
  80.  
  81. // Noun | 토큰(ProperNoun) [0,2] /
  82. // Noun | 처리(Noun) [4,2] /
  83. // ...
  84. // Noun | 어구(Noun) [10,2] /
  85. return result.ToString();
  86. }
  87. }