Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

형관봇

[C#] 트위터 형태소 분석기(Twitter-Korean) #1 본문

C#.NET

[C#] 트위터 형태소 분석기(Twitter-Korean) #1

최강도어 2017. 3. 20. 10:36

한국어 형태소 분석기의 종류는 KoNLP, 꼬꼬마, 트위터 등.. 몇가지의 형태소 분석기가 존재합니다.


그중 .NET 환경에서 쉽게 사용할 수 있는 트위터 형태소 분석기가 있습니다.


[ TwitterKoreanProcessorCS ]


이번장에서는 트위터 형태소 분석기를 이용하여, 간단하게 형태소만 분리 해보도록 하겠습니다.


GitHub에 예제 및 설명이 있습니다.

https://github.com/modamoda/TwitterKoreanProcessorCS

https://github.com/twitter/twitter-korean-text


위 링크에 들어가서 확인을 하시면 충분히 구현할 수 있습니다.



1. Nuget을 이용한 트위터 형태소 분석기 다운로드 및 설치




korean으로 검색하시면, 첫번째 Moda.Korean.TwitterKoreanProcessorCS를 선택 후, 설치를 눌러줍니다.


저는 이미 설치가 되어있어서 제거버튼이 활성화 되어있네요



2. 4가지 기능 및 예제


· 정규화(normalization)

  - 한국어를 처리하는 예시입니닼ㅋㅋㅋ -> 한국어를 처리하는 예시입니다ㅋㅋ


· 토큰화(tokenization)

  - 한국어를 처리하는 예시입니다ㅋㅋ -> 한국어Noun, 를Josa, 처리Noun, 하는Verb, 예시Noun, 입Adjective, 니다Eomi, ㅋㅋKoreanParticle


· 어근화(stemming)

  - 한국어를 처리하는 예시입니다 ㅋㅋ -> 한국어Noun, 를Josa, 처리Noun, 하다Verb, 예시Noun, 이다Adjective, ㅋㅋKoreanParticle


· 어구추출(phrase extraction)

  - 한국어를 처리하는 예시입니다 ㅋㅋ -> 한국어, 처리, 예시, 처리하는 예시



아래 코드는 제공해 주는 함수 예제입니다.


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



위 예제를 바탕으로 간단한 추출예제를 작성해 보았습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public string StemSample1()
{
    StringBuilder result = new StringBuilder();
 
    var tokens = TwitterKoreanProcessorCS.Tokenize(
TwitterKoreanProcessorCS.Normalize("한국어를 처리하는 예시입니닼ㅋㅋ"));
    var stemmedTokens = TwitterKoreanProcessorCS.Stem(tokens);
 
    foreach (var stemmedToken in stemmedTokens)
    {
        result.AppendFormat(format: "{0}({1}) [{2},{3}] / ",
            args: new object[] 
{ stemmedToken.Text, stemmedToken.Pos.ToString(), stemmedToken.Offset, stemmedToken.Length });
    }
 
    return result.ToString();
}
cs


[ 결과 ]




형태소 분석을 전처리로 하여,


다음장에서는 챗봇을 구성하는 작업을 해보겠습니다.




'C#.NET' 카테고리의 다른 글

[C#] API 사용시 강제 이벤트 전송  (0) 2017.04.26
Comments