Python : 언어를 결정하는 방법?


90

나는 이것을 얻고 싶다 :

Input text: "ру́сский язы́к"
Output text: "Russian" 

Input text: "中文"
Output text: "Chinese" 

Input text: "にほんご"
Output text: "Japanese" 

Input text: "العَرَبِيَّة"
Output text: "Arabic"

파이썬에서 어떻게 할 수 있습니까? 감사.


4
무엇을 시도 했습니까?
Raskayu

1
이 도움이 될 수 있습니다 stackoverflow.com/questions/4545977/...
Sardorbek Imomaliev

여기에 잘 요약되어 있습니다. stackoverflow.com/a/48436520/2063605
SNA

답변:


57

langdetect보셨나요 ?

from langdetect import detect

lang = detect("Ein, zwei, drei, vier")

print lang
#output: de

28
매우 정확하지 않음-텍스트 '해부 구조'의 언어를 ro(루마니아어) 로 감지합니다 . 이러한 경우에는 여러 언어 출력이 필요합니다. polyglot은 훨씬 더 잘 수행됩니다.
Yuriy Petrovskiy

2
흥미롭게도 같은 예에서 langdetect다른 언어를 결정할 수 있습니다. :-)
Denis Kuzin

1
어떤 이유로, langdetect는, 내가 파이썬 3.6 사용하고 오류가 주어진다
풍자

Ein에 대해 들어 본 적이 없습니다 !
Timo

201
  1. TextBlob . NLTK 패키지가 필요하며 Google을 사용합니다.

    from textblob import TextBlob
    b = TextBlob("bonjour")
    b.detect_language()
    

    pip install textblob

  2. 다국어 . numpy 및 일부 신비한 라이브러리가 필요하지만 Windows에서는 작동하지 않을 것입니다 . (Windows의 경우 여기 에서 적절한 버전의 PyICU , MorfessorPyCLD2를 가져온 다음 .) 혼합 언어로 텍스트를 감지 할 수 있습니다.pip install downloaded_wheel.whl

    from polyglot.detect import Detector
    
    mixed_text = u"""
    China (simplified Chinese: 中国; traditional Chinese: 中國),
    officially the People's Republic of China (PRC), is a sovereign state
    located in East Asia.
    """
    for language in Detector(mixed_text).languages:
            print(language)
    
    # name: English     code: en       confidence:  87.0 read bytes:  1154
    # name: Chinese     code: zh_Hant  confidence:   5.0 read bytes:  1755
    # name: un          code: un       confidence:   0.0 read bytes:     0
    

    pip install polyglot

    종속성을 설치하려면 다음을 실행하십시오. sudo apt-get install python-numpy libicu-dev

  3. chardet 에는 범위 (127-255)에 문자 바이트가있는 경우 언어를 감지하는 기능도 있습니다.

    >>> chardet.detect("Я люблю вкусные пампушки".encode('cp1251'))
    {'encoding': 'windows-1251', 'confidence': 0.9637267119204621, 'language': 'Russian'}
    

    pip install chardet

  4. langdetect 많은 부분의 텍스트가 필요합니다. 내부적으로 비 결정적 접근 방식을 사용합니다. 즉, 동일한 텍스트 샘플에 대해 다른 결과를 얻습니다. 문서에 따르면 다음 코드를 사용하여 결정해야합니다.

    from langdetect import detect, DetectorFactory
    DetectorFactory.seed = 0
    detect('今一はお前さん')
    

    pip install langdetect

  5. guess_language 사전과 함께이 맞춤법 검사기를 사용하여 매우 짧은 샘플을 감지 할 수 있습니다.

    pip install guess_language-spirit

  6. langid 는 두 모듈을 모두 제공합니다.

    import langid
    langid.classify("This is a test")
    # ('en', -54.41310358047485)
    

    및 명령 줄 도구 :

    $ langid < README.md
    

    pip install langid

  7. FastText 는 텍스트 분류기이며 언어 분류를위한 적절한 모델 로 176 개 언어를 인식하는 데 사용할 수 있습니다 . 이 모델을 다운로드 한 다음 :

    import fasttext
    model = fasttext.load_model('lid.176.ftz')
    print(model.predict('الشمس تشرق', k=2))  # top 2 matching languages
    
    (('__label__ar', '__label__fa'), array([0.98124713, 0.01265871]))
    

    pip install fasttext

  8. pyCLD3 는 언어 식별을위한 신경망 모델입니다. 이 패키지에는 추론 코드와 학습 된 모델이 포함되어 있습니다.

    import cld3
    cld3.get_language("影響包含對氣候的變化以及自然資源的枯竭程度")
    
    LanguagePrediction(language='zh', probability=0.999969482421875, is_reliable=True, proportion=1.0)
    

    pip install pycld3


2
detectlang빠른 방법보다Textblob
Anwarvic

7
@Anwarvic TextBlob은 Google API ( github.com/sloria/TextBlob/blob/dev/textblob/translate.py#L33 )를 사용합니다! 그것이 느린 이유입니다.
Thomas Decaux

4
polyglot내 사용 사례에서 가장 성능이 좋았습니다. langid2 위
jamescampbell 19-02

3
언어 감지 만 필요한 경우 실제로 전체 Polyglot 패키지를 다룰 필요가 없습니다. 으로 워드 프로세서에 명시된 , 검출은에 의해 이루어집니다 pyCLD2 매우 간단하고 사용 라이브러리에 용이하다.
Jeyekomon


7

langdetect병렬화에 사용 중일 때 문제 가 있으며 실패합니다. 그러나 spacy_langdetect그것을위한 래퍼이며 그 목적으로 사용할 수 있습니다. 다음 스 니펫도 사용할 수 있습니다.

import spacy
from spacy_langdetect import LanguageDetector

nlp = spacy.load("en")
nlp.add_pipe(LanguageDetector(), name="language_detector", last=True)
text = "This is English text Er lebt mit seinen Eltern und seiner Schwester in Berlin. Yo me divierto todos los días en el parque. Je m'appelle Angélica Summer, j'ai 12 ans et je suis canadienne."
doc = nlp(text)
# document level language detection. Think of it like average language of document!
print(doc._.language['language'])
# sentence level language detection
for i, sent in enumerate(doc.sents):
    print(sent, sent._.language)

나는 당신의 대답을 따랐지만 나는 여전히 langdetect. 나는 내가 사용하고, 텍스트와 DF 열이 column.apply()함수가 일을 함께 scipy_langdetect. 어떤 제안?
Rishabh Sahrawat

와 같은 함수의 병렬화를 활용하려면 병렬 라이브러리를 사용해야합니다 dask. 그렇지 않으면 아무런 차이가 없습니다.
Habib Karbasian

3

경우 당신이 찾고있는 긴 텍스트와 함께 빠른 라이브러리 , polyglot그리고 fastext여기에 가장 좋은 일을하고있다.

더티 및 임의의 HTML 모음에서 10000 개의 문서를 샘플링했으며 결과는 다음과 같습니다.

+------------+----------+
| Library    | Time     |
+------------+----------+
| polyglot   | 3.67 s   |
+------------+----------+
| fasttext   | 6.41     |
+------------+----------+
| cld3       | 14 s     |
+------------+----------+
| langid     | 1min 8s  |
+------------+----------+
| langdetect | 2min 53s |
+------------+----------+
| chardet    | 4min 36s |
+------------+----------+

나는 많은 방법이 짧은 텍스트에 초점을 맞추고 있다는 것을 알아 챘는데, 아마도 그것은 해결하기 어려운 문제이기 때문일 것입니다. 텍스트가 많으면 언어를 감지하기가 정말 쉽습니다 (예 : 사전을 사용할 수 있습니다!). 그러나 이것은 긴 텍스트에 대해 쉽고 적합한 방법을 찾기 어렵게 만듭니다.


polyglot언어 감지는을 기반으로하며 pycld2, 그다지 빠르지 않습니다. 아니면 일종의 배치 모드에서 언어를 식별하는 데 사용하는 방법이 있습니까? 나는 문장으로 만 처리하려고 시도했습니다.
Wiktor Stribiżew

긴 텍스트가 같은 언어로되어 있다고 가정합니다. 10000 개의 문서를 읽고 기억에 보관합니다. fastextcc의 경우 \n문자 를 제거해야 하지만 polyglot의 경우는 아닙니다 (cdl2 결과는 거의 동일했으며 테스트도했습니다). 다국어가 느리다고 생각하는 이유를 이해할 수 없습니다. 당신은 내가 제거해야 생각합니까 \n뿐만 아니라, 나의 결과는 (첫 번째 전에 즉, 첫번째 문장을 반영 \n)
toto_tico

내 말은, 나는 모두 하나의 줄 문자열 인 수백만 개의 개별 문서의 언어를 확인합니다. pycld2에서는 느립니다.
Wiktor Stribiżew

나는 그것을 할 방법이 없다고 생각합니다. 하나씩해야합니다. 문서가 저장된 위치에 따라 다중 처리 기능을 사용할 수 있습니다. 또한 아시아 언어 인코딩에 문제가 있었기 때문에 fasttextcc 사용을 종료했습니다.
toto_tico

제 경우에는 대부분의 문서가 길고 짧은 문장의 벤치 마크는 매우 다르게 보일 수 있습니다.
toto_tico

3

Python 용 무제한 무료 Google 번역 API 인 Googletrans (비공식)를 사용할 수 있습니다 .

원하는만큼 요청할 수 있습니다. 제한이 없습니다.

설치:

$ pip install googletrans

언어 감지 :

>>> from googletrans import Translator
>>> t = Translator().detect("hello world!")
>>> t.lang
'en'
>>> t.confidence
0.8225234

2

경우에 따라 다음 방법 중 하나를 사용하는 데 관심이있을 수 있습니다.

방법 0 : API 또는 라이브러리 사용

일반적으로 이러한 라이브러리 중 일부는 작은 텍스트에 대해 정확하지 않고 일부 언어가 누락되고 느리고 인터넷 연결이 필요하며 무료가 아니기 때문에 몇 가지 문제가 있습니다. 그러나 일반적으로 말하면 대부분의 요구에 적합합니다. .

방법 1 : 언어 모델

언어 모델은 단어 시퀀스의 확률을 제공합니다. 이는 텍스트에 다른 언어로 된 단어가 포함 된 경우에도 텍스트의 언어를 강력하게 감지 할 수 있기 때문에 중요합니다 (예 : " 'Hola'는 스페인어로 'hello'를 의미합니다" ).

N 개 언어 모델 (언어 당 하나)을 사용하여 텍스트에 점수를 매길 수 있습니다. 감지 된 언어는 가장 높은 점수를받은 모델의 언어입니다.

이것에 대한 간단한 언어 모델을 만들고 싶다면 1 그램으로 갈 것입니다. 이렇게하려면 큰 텍스트 (예 : "X"언어로 된 Wikipedia Corpus)에서 각 단어가 나타난 횟수 만 세면됩니다.

그런 다음 단어의 확률은 빈도를 분석 된 총 단어 수 (모든 빈도의 합)로 나눈 값입니다.

the 23135851162
of  13151942776
and 12997637966
to  12136980858
a   9081174698
in  8469404971
for 5933321709
...

=> P("'Hola' means 'hello' in spanish") = P("hola") * P("means") * P("hello") * P("in") * P("spanish")

감지 할 텍스트가 상당히 크면 N 개의 임의 단어를 샘플링 한 다음 곱셈 대신 로그 합계를 사용하여 부동 소수점 정밀도 문제를 방지하는 것이 좋습니다.

P(s) = 0.03 * 0.01 * 0.014 = 0.0000042
P(s) = log10(0.03) + log10(0.01) + log10(0.014) = -5.376

방법 2 : 교차 세트

더 간단한 접근 방식은 상위 M 개의 가장 자주 사용되는 단어로 N 세트 (언어 당 하나씩)를 준비하는 것입니다. 그런 다음 각 세트와 텍스트를 교차하십시오. 교차로 수가 가장 많은 세트가 감지 된 언어가됩니다.

spanish_set = {"de", "hola", "la", "casa",...}
english_set = {"of", "hello", "the", "house",...}
czech_set = {"z", "ahoj", "závěrky", "dům",...}
...

text_set = {"hola", "means", "hello", "in", "spanish"}

spanish_votes = text_set.intersection(spanish_set)  # 1
english_votes = text_set.intersection(english_set)  # 4
czech_votes = text_set.intersection(czech_set)  # 0
...

방법 3 : Zip 압축

이것은 다른 무엇보다 호기심이 많지만 여기에 있습니다 ... 텍스트를 압축 한 다음 (예 : LZ77) 참조 압축 텍스트 (대상 언어)와 관련하여 우편 거리를 측정 할 수 있습니다. 개인적으로 다른 방법보다 느리고 정확하지 않으며 설명이 적기 때문에 마음에 들지 않았습니다. 그럼에도 불구하고이 방법에 대한 흥미로운 응용 프로그램이있을 수 있습니다. 더 읽기 : 언어 트리 및 압축


1

사전 훈련 된 빠른 텍스트 모델이 비슷한 요구 사항에 가장 적합했습니다.

나는 매우 유사한 필요로 귀하의 질문에 도달했습니다. 내 특정 요구 사항에 대한 Rabash의 답변에서 가장 많은 도움을 받았습니다.

60,000 개 이상의 텍스트 파일에서 텍스트 파일이 영어로되어 있는지 확인하는 그의 권장 사항 중에서 가장 효과적인 것이 무엇인지 실험 한 후, 저는 fasttext가 그러한 작업을위한 훌륭한 도구라는 것을 발견했습니다.

약간의 작업으로 많은 파일에서 매우 빠르게 작동하는 도구가 생겼습니다. 그러나 fasttext는 라인 목록에서 쉽게 작동하기 때문에 귀하의 경우와 같이 쉽게 수정할 수 있습니다.

댓글이있는 내 코드는 게시물 의 답변 중 하나 입니다. 나는 당신과 다른 사람들이 다른 특정 요구에 맞게이 코드를 쉽게 수정할 수 있다고 믿습니다.


0

입력 문자열에서 문자의 유니 코드 그룹을 결정하여 언어 유형 (예 : 러시아어의 경우 키릴 자모)을 지정한 다음 텍스트에서 언어 별 기호를 검색 할 수 있습니다.


0

나는 모든 라이브러리를 시험해 보았고 pycld2가 빠르고 정확하다는 결론을 내 렸습니다.

다음과 같이 설치할 수 있습니다.

python -m pip install -U pycld2

다음과 같이 사용할 수 있습니다.

isReliable, textBytesFound, details = cld2.detect(your_sentence)

print(isReliable, details[0][1]) # reliablity(bool),lang abbrev.(en/es/de...)   
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.