Python:如何确定语言?

时间:2016-08-25 10:26:00

标签: python string parsing

我想得到这个:

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

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

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

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

我怎么能在python中做到这一点?感谢。

10 个答案:

答案 0 :(得分:62)

  1. TextBlob。需要NLTK包,使用Google。

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

    1. Polyglot。需要numpy和一些神秘的库,不太可能让它适用于Windows 。 (对于Windows,从here获取适当版本的 PyICU Morfessor PyCLD2 ,然后只需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
      
    2. pip install polyglot

      要安装依赖项,请运行: sudo apt-get install python-numpy libicu-dev

      1. chardet还具有检测语言的功能,如果范围内有字符字节(127-255):

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

        1. langdetect需要大部分文字。它使用非确定性方法。这意味着您可以为同一文本示例获得不同的结果。文档说你必须使用以下代码来确定:

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

          1. guess_language可以使用带有字典的this拼写检查功能来检测非常短的样本。
          2. pip install guess_language-spirit

            1. langid提供了两个模块

              import langid
              langid.classify("This is a test")
              # ('en', -54.41310358047485)
              
            2. 和命令行工具:

                  $ langid < README.md
              

              pip install langid

答案 1 :(得分:31)

你看过langdetect吗?

from langdetect import detect

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

print lang
#output: de

答案 2 :(得分:5)

@Rabash 在 https://stackoverflow.com/a/47106810/610569

上有一个很好的工具列表

@toto_tico 在呈现速度比较方面做得很好。

这是一个简短的摘要,为他们添加了上述出色的答案(截至 2021 年)

<头>
语言识别软件 使用者 开源/模型 基于规则 基于统计 可以训练/调整
Google Translate Language Detection TextBlob(限制使用) - -
Chardet -
Guess Language(非主动开发) spirit-guess(更新重写) 最低限度
pyCLD2 Polyglot 有点 不确定
CLD3 - 可能
langid-py - 不确定
langdetect SpaCy-langdetect
FastText What The Lang 不确定

答案 3 :(得分:3)

如果您要查找的是 快速处理长文本的库 ,那么polyglotfastext将在此处发挥最佳作用。< / p>

我从一组脏的和随机的HTML中采样了10000个文档,结果如下:

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

我注意到许多方法都针对短文本,这可能是因为这是一个很难解决的问题:如果您有很多文本,检测语言真的很容易(例如,可以只使用一本字典) !)。但是,这使得很难找到一种简单而合适的长文本方法。

答案 4 :(得分:3)

您可以使用Googletrans(非官方)免费且不受限制的Google Python Python翻译API。

您可以根据需要发出任意数量的请求,没有限制

安装:

$ pip install googletrans

语言检测:

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

答案 5 :(得分:2)

根据情况,您可能会对使用以下方法之一感兴趣:

方法0:使用API​​或库

通常,这些库存在一些问题,因为其中一些库无法准确显示小文本,某些语言缺少,运行缓慢,需要互联网连接,非免费,...但是总的来说,它们会适合大多数需求。

方法1:语言模型

语言模型为我们提供了单词序列的概率。这很重要,因为它使我们能够稳健地检测文本的语言,即使文本包含其他语言的单词(例如:“'Hola'的意思是西班牙语的'hello'” )。

您可以使用N种语言模型(每种语言一种)来对文本评分。检测到的语言将是给您最高分的模型语言。

如果您要为此构建一个简单的语言模型,我将选择1克。为此,您只需要计算大文本(例如,“ X”语言的维基百科语料库)中每个单词出现的次数。

然后,一个单词的概率将是其频率除以所分析的单词总数(所有频率之和)。

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:相交集

一种更简单的方法是准备N个集合(每种语言一个),并使用最常见的M个单词。然后将您的文本与每个集合相交。交点数量最多的集合将是您检测到的语言。

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),然后针对参考压缩文本(目标语言)测量zip距离。就我个人而言,我不喜欢它,因为它比其他方法更慢,更不准确且更具描述性。但是,此方法可能会有有趣的应用。 要了解更多信息:Language Trees and Zipping

答案 6 :(得分:0)

您可以尝试在输入字符串中确定字符串的Unicode组以指出语言类型(例如,俄语的西里尔字母),然后在文本中搜索特定于语言的符号。

答案 7 :(得分:0)

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)

答案 8 :(得分: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...)   

答案 9 :(得分:-1)

预训练的快速文本模型最适合我的类似需求

我对您的问题有非常相似的需求。对于我的特定需求,我从Rabash的答案中找到了最大的帮助。

在尝试找出最适合他的建议之后,即确保60,000多个文本文件中的文本为英文,我发现fasttext是完成此任务的绝佳工具。

做了一些工作,我有一个工具可以快速处理许多文件。但是它可以很容易地针对您的情况进行修改,因为fasttext可以轻松地处理行列表。

我的带有注释的代码是THIS帖子的答案之一。我相信您和其他人可以轻松地为其他特定需求修改此代码。