Python:如何确定语言?


86

我想得到这个:

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

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

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

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

如何在python中完成?谢谢。


2
你尝试了什么?
拉斯卡尤(Raskayu),2016年


很好地总结了这里stackoverflow.com/a/48436520/2063605
SNA

Answers:


56

您看过langdetect吗?

from langdetect import detect

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

print lang
#output: de

26
不太准确-将文本“解剖结构”的语言检测为ro(罗马尼亚语)。在这种情况下需要多种语言输出。多语言的性能要好得多。
Yuriy Petrovskiy

1
有趣的是,对于同一示例langdetect,可以确定不同的语言:-)
Denis Kuzin

1
由于某种原因,langdetect被给予错误,我正在使用Python 3.6
innuendo

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

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

    pip install textblob

  2. 多种语言。需要numpy和一些奥术库,不太可能使它在Windows上运行。(对于Windows,从此处获取适当的PyICUMorfessorPyCLD2版本,然后单击即可。)能够检测混合语言的文本。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. 如果字符字节的范围在(127-255]之间,chardet还具有检测语言的功能:

    >>> 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
detectlangTextblob
Anwarvic '18 -4-24

6
@Anwarvic TextBlob使用Google API(github.com/sloria/TextBlob/blob/dev/textblob/translate.py#L33)!那就是为什么它很慢。
Thomas Decaux

3
polyglot最终成为我的用例中性能最高的。langid第二名
jamescampbell,

3
如果仅需要语言检测,则实际上不必处理整个Polyglot软件包。如docs中所述,检测是通过pyCLD2完成的,它非常简单且易于使用。
Jeyekomon

1
还有pyCLD3
tttthomassssss

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,否则不会有任何区别。
哈比卜·卡尔巴斯蒂安

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,并不是全部都那么快。还是有一种方法可以使用它以一种批处理模式识别语言?我只尝试逐句处理。
WiktorStribiżew

我认为长文本使用相同的语言。我阅读了10000个文档并将其保存在内存中。对于fastextcc,我必须删除\n字符,但对于多语种则不必删除(cdl2结果几乎相同,我也对其进行了测试)。我不明白为什么您会说多语种很慢,这是最快的。您是否认为我也应该删除\n,并且我的结果仅反映了第一句话(即,在第一句话之前\n
toto_tico

我的意思是,我检查了数以百万计的单独文档的语言,这些文档都是一行。pycld2太慢了。
WiktorStribiżew

我知道,我认为没有办法做到这一点。您必须一一完成。根据文档的存储位置,您可以使用多处理功能。另外,由于使用亚洲语言编码时遇到了一些麻烦,因此我停止使用fasttextcc。
toto_tico

以我为例,大多数文档都很长,而基准测试用短句子看起来可能会大不相同。
toto_tico

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:压缩压缩

好奇心比什么都重要,但是在这里有用……您可以压缩文本(例如LZ77),然后相对于参考压缩文本(目标语言)测量zip距离。就我个人而言,我不喜欢它,因为它比其他方法更慢,更不准确且更具描述性。但是,此方法可能会有有趣的应用。阅读更多内容:语言树和压缩


2

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

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

安装:

$ pip install googletrans

语言检测:

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

1

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

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

在尝试找到最能使他推荐的建议中最有效的方法(确定文本文件中的英语超过60,000个)后,我发现fasttext是执行此任务的出色工具。

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

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


0

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


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...)   
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.