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

나는 이것을 얻고 싶다 :

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

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

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

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

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



답변

langdetect보셨나요 ?

from langdetect import detect

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

print lang
#output: de


답변

  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


답변

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)


답변

경우 당신이 찾고있는 긴 텍스트와 함께 빠른 라이브러리 , 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 |
+------------+----------+

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


답변

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

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

설치:

$ pip install googletrans

언어 감지 :

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


답변

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

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


답변

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

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

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

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

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