
그 작업은 간단합니다. 일부 텍스트가 작성되는 언어를 알려줍니다. 이는 텍스트 분류 및 맞춤법 검사와 같은 자연어 처리 응용 프로그램에서 언어 데이터의 전처리 단계로 매우 유용합니다. 예를 들어, 다른 사용 사례에는 이메일을 전자 메일 언어를 기반으로 오른쪽 지리적으로 위치한 고객 서비스 부서로 전자 메일을 라우팅하는 것이 포함될 수 있습니다.
언어 탐지는 종종 대규모 기계 학습 프레임 워크 또는 자연어 처리 응용 프로그램의 일부로 수행됩니다. 해당 시스템의 본격적인 기능이 필요하지 않거나 그 로프를 배우고 싶지 않은 경우 작은 유연한 라이브러리가 편리합니다.
지금 까지이 작업을위한 GO 생태계의 유일한 포괄적 인 오픈 소스 라이브러리는 Whatlanggo 입니다. 불행히도, 그것은 두 가지 주요 단점이 있습니다.
Lingua는 이러한 문제를 제거하는 것을 목표로합니다. 그녀는 거의 구성이 필요하지 않으며 단일 단어와 문구에서도 길고 짧은 텍스트에서 매우 정확한 결과를 얻습니다. 그녀는 규칙 기반 및 통계적 방법을 모두 사용하지만 단어의 사전을 사용하지 않습니다. 그녀는 외부 API 또는 서비스에 연결할 필요가 없습니다. 라이브러리가 다운로드되면 완전히 오프라인으로 사용할 수 있습니다.
다른 언어 탐지 라이브러리와 비교할 때, Lingua의 초점은 수량보다 품질 , 즉 새로운 언어를 추가하기 전에 먼저 작은 언어 세트에 대한 탐지를 얻는 것입니다. 현재 다음 75 개 언어가 지원됩니다.
Lingua는 지원되는 각 언어에 대해 사용할 수있는 일부 번들 테스트 데이터에 대한 정확도 통계를보고 할 수 있습니다. 각 언어에 대한 테스트 데이터는 세 부분으로 나뉩니다.
언어 모델과 테스트 데이터는 독일 라이프 치히 대학교에서 제공하는 Wortschatz Corpora의 별도 문서에서 만들어졌습니다. 다양한 뉴스 웹 사이트에서 기어 다니는 데이터는 훈련에 사용되었으며 각 코퍼스는 백만 문장으로 구성되어 있습니다. 테스트를 위해 임의로 선택한 웹 사이트로 만든 Corpora가 사용되었으며 각각은 1 천 문장으로 구성되어 있습니다. 각각의 테스트 코퍼스에서, 1000 개의 단일 단어의 무작위로 분류되지 않은 하위 집합, 1000 단어 쌍 및 1000 개의 문장이 각각 추출되었습니다.
생성 된 테스트 데이터를 감안할 때, 나는 Lingua의 지원되는 75 개 언어의 데이터를 실행하는 Lingua 와 Whatlanggo 의 탐지 결과를 비교했습니다. 또한 GOCLD3 바인딩의 도움과 비교하기 위해 Google의 CLD3을 추가했습니다. CLD3 또는 Whatlanggo 에서 지원하지 않는 언어는 감지 과정에서 단순히 무시됩니다.
다음 섹션 각각에는 두 개의 플롯이 포함되어 있습니다. 막대 플롯은 지원되는 각 언어에 대한 자세한 정확도 결과를 보여줍니다. 박스 플롯은 각 분류기의 정확도 값 분포를 보여줍니다. 상자 자체는 데이터의 중간 50 %가 내부에있는 영역을 나타냅니다. 색상 상자 내에서 수평선은 분포의 중앙값을 표시합니다.
아래 표는 평균, 중간 및 표준 편차를 포함한 각 언어 및 분류기에 대한 자세한 통계를 보여줍니다.
| 언어 | 평균 | 한 단어 | 단어 쌍 | 문장 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 링구아 (높은 정확도 모드) | 링구아 (낮은 정확도 모드) | cld3 | Whatlang | 링구아 (높은 정확도 모드) | 링구아 (낮은 정확도 모드) | cld3 | Whatlang | 링구아 (높은 정확도 모드) | 링구아 (낮은 정확도 모드) | cld3 | Whatlang | 링구아 (높은 정확도 모드) | 링구아 (낮은 정확도 모드) | cld3 | Whatlang | |
| 아프리카 어 | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| 알바니아 | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| 아라비아 말 | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| 아르메니아 사람 | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| 아제르바이잔 | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| 바스크 사람 | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| 벨로루시 | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| 벵골 사람 | 100 | 100 | 99 | 100 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 |
| Bokmal | 58 | 50 | - | 34 | 39 | 27 | - | 15 | 59 | 47 | - | 28 | 77 | 75 | - | 60 |
| 보스니아 인 | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| 불가리아 사람 | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| 카탈로니아 사람 | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| 중국인 | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| 크로아티아 | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| 체코 사람 | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| 덴마크 말 | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| 네덜란드 사람 | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| 영어 | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| 에스페란토 말 | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| 에스토니아 사람 | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| 핀란드 | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| 프랑스 국민 | 89 | 77 | 55 | 64 | 74 | 52 | 22 | 37 | 94 | 83 | 49 | 59 | 99 | 98 | 94 | 97 |
| 간다 | 91 | 84 | - | - | 79 | 65 | - | - | 95 | 87 | - | - | 100 | 100 | - | - |
| 그루지야 사람 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| 독일 사람 | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| 그리스 사람 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| 구자라트 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| 헤브라이 사람 | 100 | 100 | - | 90 | 100 | 100 | - | 76 | 100 | 100 | - | 94 | 100 | 100 | - | 99 |
| 힌디 어 | 73 | 33 | 58 | 52 | 61 | 11 | 34 | 27 | 64 | 20 | 45 | 40 | 95 | 67 | 95 | 88 |
| 헝가리 인 | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| 아이슬란드 | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| 인도네시아 인 | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| 아일랜드 | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| 이탈리아 사람 | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| 일본어 | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| 카자흐 | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| 한국인 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| 라틴어 | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| 라트비아 사람 | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| 리투아니아 사람 | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| 마케도니아 어 | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| 말레이 사람 | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| 마오리족 | 91 | 82 | 52 | - | 82 | 62 | 22 | - | 92 | 87 | 43 | - | 99 | 98 | 91 | - |
| 마라 티 | 85 | 39 | 84 | 73 | 74 | 16 | 69 | 52 | 85 | 30 | 84 | 74 | 96 | 72 | 98 | 93 |
| 몽고 어 | 97 | 95 | 83 | - | 93 | 89 | 63 | - | 99 | 98 | 87 | - | 99 | 99 | 99 | - |
| Nynorsk | 66 | 52 | - | 34 | 41 | 25 | - | 10 | 66 | 49 | - | 24 | 91 | 81 | - | 69 |
| 페르시아 인 | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| 광택 | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| 포르투갈 인 | 81 | 69 | 53 | 57 | 59 | 42 | 21 | 26 | 85 | 70 | 40 | 48 | 99 | 95 | 97 | 96 |
| 펀 자브 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| 루마니아 사람 | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| 러시아인 | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| 세르비아 사람 | 88 | 78 | 78 | 57 | 74 | 62 | 63 | 34 | 90 | 80 | 75 | 51 | 99 | 91 | 95 | 86 |
| 쇼나 | 91 | 81 | 76 | 68 | 78 | 56 | 51 | 44 | 96 | 86 | 79 | 65 | 100 | 100 | 99 | 95 |
| 슬로바키아 사람 | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| 슬로베니아 | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| 소말리아 | 92 | 85 | 69 | 68 | 82 | 64 | 38 | 38 | 96 | 90 | 70 | 66 | 100 | 100 | 100 | 99 |
| 소토 | 86 | 72 | 49 | - | 67 | 43 | 15 | - | 90 | 75 | 33 | - | 100 | 97 | 98 | - |
| 스페인 사람 | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| 스와 할리 | 81 | 70 | 57 | - | 60 | 43 | 25 | - | 84 | 68 | 49 | - | 98 | 97 | 98 | - |
| 스웨덴어 | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| 타갈로그 | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| 타밀 사람 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| 텔루구 어 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| 태국 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 99 |
| Tsonga | 84 | 72 | - | - | 66 | 46 | - | - | 89 | 73 | - | - | 98 | 97 | - | - |
| TSWANA | 84 | 71 | - | - | 65 | 44 | - | - | 88 | 73 | - | - | 99 | 96 | - | - |
| 터키 | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| 우크라이나 말 | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| 우르두어 | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| 베트남 사람 | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| 웨일스 말 | 91 | 82 | 69 | - | 78 | 61 | 43 | - | 96 | 87 | 66 | - | 99 | 99 | 98 | - |
| Xhosa | 82 | 69 | 66 | - | 64 | 45 | 40 | - | 85 | 67 | 65 | - | 98 | 94 | 92 | - |
| 요 루바 | 74 | 62 | 15 | 22 | 50 | 33 | 5 | 11 | 77 | 61 | 11 | 14 | 96 | 92 | 28 | 41 |
| 줄루 족 | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| 평균 | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| 중앙값 | 89.0 | 80.0 | 68.0 | 62.0 | 74.0 | 57.0 | 41.0 | 38.0 | 94.0 | 81.0 | 66.0 | 57.0 | 99.0 | 97.0 | 98.0 | 94.0 |
| 표준 편차 | 13.08 | 17.29 | 19.04 | 20.22 | 18.41 | 24.9 | 27.86 | 29.28 | 13.12 | 18.93 | 21.83 | 24.22 | 11.05 | 11.91 | 13.95 | 11.24 |
모든 언어 탐지기는 일부 훈련 코퍼스의 캐릭터 분포에 대해 훈련 된 확률 론적 N- 그램 모델을 사용합니다. 대부분의 라이브러리는 여러 문장으로 구성된 더 긴 텍스트 조각의 언어를 감지하는 데 만족스러운 크기 3 (Trigrams)의 n 그램 만 사용합니다. 그러나 짧은 문구 나 단일 단어의 경우 트리 그램으로는 충분하지 않습니다. 입력 텍스트가 짧을수록 N- 그램이 적습니다. 이러한 N- 그램으로 추정 된 확률은 신뢰할 수 없습니다. 이것이 Lingua가 크기 1에서 5까지의 N- 그램을 사용하여 올바른 언어를 훨씬 더 정확하게 예측하는 이유입니다.
두 번째 중요한 차이점은 Lingua가 그러한 통계 모델뿐만 아니라 규칙 기반 엔진을 사용한다는 것입니다. 이 엔진은 먼저 입력 텍스트의 알파벳을 결정하고 하나 이상의 언어로 고유 한 문자를 검색합니다. 정확히 하나의 언어를 이런 식으로 안정적으로 선택할 수 있다면 더 이상 통계 모델이 필요하지 않습니다. 어쨌든 규칙 기반 엔진은 입력 텍스트의 조건을 충족하지 않는 언어를 필터링합니다. 그런 다음 두 번째 단계에서는 확률 론적 N- 그램 모델이 고려됩니다. 언어 모델을 적게로드하면 메모리 소비가 적고 런타임 성능이 향상되기 때문에 의미가 있습니다.
일반적으로 각 API 방법을 사용하여 분류 프로세스에서 고려해야 할 언어 세트를 항상 제한하는 것이 좋습니다. 미리 알고 있다면 특정 언어가 입력 텍스트에서 발생하지 않아야한다는 사실을 알면 분류 프로세스에 참여하지 마십시오. 규칙 기반 엔진의 필터링 메커니즘은 상당히 좋지만 입력 텍스트에 대한 자체 지식을 기반으로 필터링이 항상 바람직합니다.
위의 정확성 결과를 재현하려면 다음을 수행하여 분류기와 모든 언어에 대한 테스트 보고서를 직접 생성 할 수 있습니다.
cd cmd
go run accuracy_reporter.go
GOCLD3이 성공적으로 실행 되려면 불행한 Google 프로토콜 버퍼의 정확한 버전 3.17.3을 설치해야합니다. 각 탐지기 및 언어에 대해 테스트 보고서 파일이 작성 /accuracy-reports 에 기록됩니다. 예를 들어, Lingua German 보고서의 현재 출력은 다음과 같습니다.
##### German #####
>>> Accuracy on average: 89.23%
>> Detection of 1000 single words (average length: 9 chars)
Accuracy: 73.90%
Erroneously classified as Dutch: 2.30%, Danish: 2.10%, English: 2.00%, Latin: 1.90%, Bokmal: 1.60%, Basque: 1.20%, French: 1.20%, Italian: 1.20%, Esperanto: 1.10%, Swedish: 1.00%, Afrikaans: 0.80%, Tsonga: 0.70%, Nynorsk: 0.60%, Portuguese: 0.60%, Yoruba: 0.60%, Finnish: 0.50%, Sotho: 0.50%, Welsh: 0.50%, Estonian: 0.40%, Irish: 0.40%, Polish: 0.40%, Spanish: 0.40%, Swahili: 0.40%, Tswana: 0.40%, Bosnian: 0.30%, Icelandic: 0.30%, Tagalog: 0.30%, Albanian: 0.20%, Catalan: 0.20%, Croatian: 0.20%, Indonesian: 0.20%, Lithuanian: 0.20%, Maori: 0.20%, Romanian: 0.20%, Xhosa: 0.20%, Zulu: 0.20%, Latvian: 0.10%, Malay: 0.10%, Slovak: 0.10%, Slovene: 0.10%, Somali: 0.10%, Turkish: 0.10%
>> Detection of 1000 word pairs (average length: 18 chars)
Accuracy: 94.10%
Erroneously classified as Dutch: 0.90%, Latin: 0.80%, English: 0.70%, Swedish: 0.60%, Danish: 0.50%, French: 0.40%, Bokmal: 0.30%, Irish: 0.20%, Tagalog: 0.20%, Afrikaans: 0.10%, Esperanto: 0.10%, Estonian: 0.10%, Finnish: 0.10%, Italian: 0.10%, Maori: 0.10%, Nynorsk: 0.10%, Somali: 0.10%, Swahili: 0.10%, Tsonga: 0.10%, Turkish: 0.10%, Welsh: 0.10%, Zulu: 0.10%
>> Detection of 1000 sentences (average length: 111 chars)
Accuracy: 99.70%
Erroneously classified as Dutch: 0.20%, Latin: 0.10%
go get github.com/pemistahl/lingua-go
Lingua는 최소한 GO 버전 1.18을 필요로합니다.
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
소스 코드에는 광범위한 단위 테스트 스위트가 동반됩니다. 테스트를 실행하려면 간단히 말하십시오.
go test
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
if language , exists := detector . DetectLanguageOf ( "languages are awesome" ); exists {
fmt . Println ( language )
}
// Output: English
}기본적으로 Lingua는 주어진 입력 텍스트에 대해 가장 가능성이 높은 언어를 반환합니다. 그러나 둘 이상의 언어로 같은 철자가있는 단어가 있습니다. 예를 들어 Prologue라는 단어는 유효한 영어와 프랑스어 단어입니다. Lingua는 주어진 맥락에서 잘못된 영어 또는 프랑스어를 출력합니다. 이와 같은 경우, 가능한 각 언어에 대한 확률이 만족 해야하는 로그 및 요약 된 최소 상대 거리를 지정할 수 있습니다. 다음과 같은 방식으로 언급 할 수 있습니다.
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
WithMinimumRelativeDistance ( 0.9 ).
Build ()
language , exists := detector . DetectLanguageOf ( "languages are awesome" )
fmt . Println ( language )
fmt . Println ( exists )
// Output:
// Unknown
// false
} 언어 확률 사이의 거리는 입력 텍스트의 길이에 따라 다릅니다. 입력 텍스트가 길수록 언어 사이의 거리가 커집니다. 따라서 매우 짧은 텍스트 문구를 분류하려면 최소 상대 거리를 너무 높게 설정하지 마십시오. 그렇지 않으면 Unknown 위의 예에서와 같이 대부분의 시간을 반환합니다. 이것은 언어 탐지가 확실하게 불가능한 경우의 반환 값입니다. 이 값은 언어 탐지기를 구축 할 때 입력 언어 세트에 포함되지 않습니다. 포함하면 입력 언어 세트에서 자동으로 제거됩니다.
가장 가능성이 높은 언어에 대해 아는 것은 좋지만 계산 된 가능성은 얼마나 신뢰할 수 있습니까? 그리고 가장 가능성이 높은 언어와 비교할 때 다른 검사 언어는 얼마나 적습니까? 이러한 질문에도 답할 수 있습니다.
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
confidenceValues := detector . ComputeLanguageConfidenceValues ( "languages are awesome" )
for _ , elem := range confidenceValues {
fmt . Printf ( "%s: %.2f n " , elem . Language (), elem . Value ())
}
// Output:
// English: 0.93
// French: 0.04
// German: 0.02
// Spanish: 0.01
} 위의 예에서, ConfidenceValue 로 내림차순으로 정렬 된 모든 가능한 언어를 포함하여 신뢰도 한 조각이 반환됩니다. 각 값은 0.0에서 1.0 사이의 확률입니다. 모든 언어의 확률은 1.0으로 합산됩니다. 규칙 엔진에 의해 언어가 명확하게 식별되면, 값 1.0은 항상이 언어에 대해 반환됩니다. 다른 언어의 값은 0.0입니다.
하나의 특정 언어에 대한 신뢰도를 반환하는 방법도 있습니다.
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04이 방법이 계산하는 값은 0.0에서 1.0 사이입니다. 규칙 엔진에 의해 언어가 명확하게 식별되면 값 1.0은 항상 반환됩니다. 주어진 언어 가이 검출기 인스턴스에 의해 지원되지 않으면 값 0.0은 항상 반환됩니다.
기본적으로 Lingua는 Lazy-Loading을 사용하여 규칙 기반 필터 엔진과 관련된 것으로 간주되는 주문형 언어 모델 만로드합니다. 예를 들어, 웹 서비스의 경우 서비스 응답을 기다리는 동안 예기치 않은 대기 시간을 피하기 위해 모든 언어 모델을 메모리에 사전로드하는 것이 좋습니다. 간절한로드 모드를 활성화하려면 다음과 같이 할 수 있습니다.
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () LanguageDetector 의 여러 인스턴스는 인스턴스에 의해 비동기 적으로 액세스되는 메모리에서 동일한 언어 모델을 공유합니다.
Lingua의 높은 탐지 정확도는 다른 언어 탐지기보다 눈에 띄게 느려지는 비용이 발생합니다. 큰 언어 모델은 또한 상당한 양의 기억을 소비합니다. 이러한 요구 사항은 리소스가 부족한 시스템의 경우 실현 가능하지 않을 수 있습니다. 대부분 긴 텍스트를 분류하거나 리소스를 저장 해야하는 경우 언어 모델의 작은 하위 집합 만 메모리에로드하는 저 정확도 모드를 사용할 수 있습니다.
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()이 접근법의 단점은 120 자 미만으로 구성된 짧은 텍스트의 탐지 정확도가 크게 떨어질 것입니다. 그러나 120 자 미만의 텍스트의 탐지 정확도는 대부분 영향을받지 않습니다.
높은 정확도 모드 (기본값)에서 언어 탐지기는 모든 언어 모델이로드되면 약 1,800MB의 메모리를 소비합니다. 낮은 정확도 모드에서는 메모리 소비가 약 110MB로 감소됩니다. 목표는 이후 릴리스에서 메모리 소비를 더욱 줄이는 것입니다.
더 작은 메모리 풋 프린트와 더 빠른 성능의 대안은 언어 탐지기를 구축 할 때 언어 세트를 줄이는 것입니다. 대부분의 경우 모든 지원되는 언어로부터 탐지기를 구축하는 것이 좋지 않습니다. 분류하려는 텍스트에 대한 지식이 있으면 거의 항상 특정 언어를 불가능하거나 발생하지 않을 수 있습니다.
Lingua는 대부분의 다른 언어 탐지기와 달리 혼합 텍스트에서 여러 언어를 감지 할 수 있습니다. 이 기능은 상당히 합리적인 결과를 얻을 수 있지만 여전히 실험 상태이므로 감지 결과는 입력 텍스트에 크게 의존합니다. 각 언어마다 여러 개의 긴 단어로 고당도 모드에서 가장 잘 작동합니다. 문구와 단어가 짧을수록 결과가 덜 정확합니다. 언어 탐지기를 구축 할 때 언어 세트를 줄이면 텍스트에서 발생하는 언어가 해당 언어 탐지기 인스턴스에서 지원하는 언어와 같으면이 작업의 정확도를 향상시킬 수 있습니다.
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
sentence := "Parlez-vous français? " +
"Ich spreche Französisch nur ein bisschen. " +
"A little bit is better than nothing."
for _ , result := range detector . DetectMultipleLanguagesOf ( sentence ) {
fmt . Printf ( "%s: '%s' n " , result . Language (), sentence [ result . StartIndex (): result . EndIndex ()])
}
// Output:
// French: 'Parlez-vous français? '
// German: 'Ich spreche Französisch nur ein bisschen. '
// English: 'A little bit is better than nothing.'
} 위의 예에서는 DetectionResult 곡 조각이 반환됩니다. 슬라이스의 각 항목은 인접한 단일 언어 텍스트 섹션을 설명하여 각 하위 문자의 시작 및 종료 지수를 제공합니다.
예를 들어 언어 데이터가 라틴어로 작성되지 않았다는 것을 미리 알고있는 분류 작업이있을 수 있습니다. 의사 결정 과정에서 특정 언어를 제외하거나 관련 언어를 명시 적으로 포함하는 경우 탐지 정확도가 더 나을 수 있습니다.
// Include all languages available in the library.
lingua . NewLanguageDetectorBuilder (). FromAllLanguages ()
// Include only languages that are not yet extinct (= currently excludes Latin).
lingua . NewLanguageDetectorBuilder (). FromAllSpokenLanguages ()
// Include only languages written with Cyrillic script.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithCyrillicScript ()
// Exclude only the Spanish language from the decision algorithm.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithout ( lingua . Spanish )
// Only decide between English and German.
lingua . NewLanguageDetectorBuilder (). FromLanguages ( lingua . English , lingua . German )
// Select languages by ISO 639-1 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_1 ( lingua . EN , lingua . DE )
// Select languages by ISO 639-3 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_3 ( lingua . ENG , lingua . DEU )계획된 문제를 살펴보십시오.
Lingua 에 대한 기여는 대단히 감사합니다. 라이브러리에 새로운 언어를 추가하는 방법에 대해서는 CONTRIBUTING.md 의 지침을 읽으십시오.