Python:如何确定语言?

Rit*_*ita 61 python string parsing

我想得到这个:

Input text: "???????? ?????"
Output text: "Russian" 

Input text: "??"
Output text: "Chinese" 

Input text: "????"
Output text: "Japanese" 

Input text: "????????????"
Output text: "Arabic" 
Run Code Online (Sandbox Code Playgroud)

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

Rab*_*ash 105

  1. TextBlob.需要NLTK包,使用谷歌.

    from textblob import TextBlob
    b = TextBlob("bonjour")
    b.detect_language()
    
    Run Code Online (Sandbox Code Playgroud)

pip install textblob

  1. 多语言.需要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
    
    Run Code Online (Sandbox Code Playgroud)

pip install polyglot

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

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

    >>> chardet.detect("? ????? ??????? ????????".encode('cp1251'))
    {'encoding': 'windows-1251', 'confidence': 0.9637267119204621, 'language': 'Russian'}
    
    Run Code Online (Sandbox Code Playgroud)

pip install chardet

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

    from langdetect import detect, DetectorFactory
    DetectorFactory.seed = 0
    detect('???????')
    
    Run Code Online (Sandbox Code Playgroud)

pip install langdetect

  1. guess_language可以通过使用检测非常短的样品的拼写检查使用词典.

pip install guess_language-spirit

  1. langid提供了两个模块

    import langid
    langid.classify("This is a test")
    # ('en', -54.41310358047485)
    
    Run Code Online (Sandbox Code Playgroud)

和命令行工具:

    $ langid < README.md
Run Code Online (Sandbox Code Playgroud)

pip install langid

  • `polyglot` 最终成为我用例中性能最高的。`langid`排在第二位 (5认同)
  • 如果语言检测是您唯一需要的,您实际上不必处理整个 Polyglot 包。正如[文档中所述](https://polyglot.readthedocs.io/en/latest/Detection.html),检测是由[pyCLD2](https://github.com/aboSamoor/pycld2)完成的,其中是非常简单易用的库。 (5认同)
  • `detectlang` 比 `Textblob` 快得多 (3认同)
  • 还有[pyCLD3](https://github.com/bsolomon1124/pycld3)。 (3认同)
  • 即使在我奇怪的母语的简短片段上,我也使用 pyCLD3 取得了非常好的结果。 (3认同)
  • @Anwarvic TextBlob使用Google API(https://github.com/sloria/TextBlob/blob/dev/textblob/translate.py#L33)!这就是为什么它很慢. (2认同)
  • 这是一个模范答案 (2认同)
  • pyCLD3 可能是其中的最佳选择。其词嵌入方法准确/快速,同时比 fasttext 更易于使用,fasttext 需要单独的模型,不支持段落等。 (2认同)
  • 非常疯狂,TextBlob 失败并显示“HTTP 错误 429:请求过多” (2认同)

小智 39

你看过langdetect吗?

from langdetect import detect

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

print lang
#output: de
Run Code Online (Sandbox Code Playgroud)

  • 不太准确 - 将文本"解剖结构"的语言检测为"ro"(罗马尼亚语).这种情况需要多语言输出.多语言表现得更好. (15认同)
  • 有趣的是,对于同一个例子,`langdetect` 可以确定不同的语言:-) (2认同)
  • 不准确,检测到“上帝就是爱”为克罗地亚语的 hr (2认同)

tot*_*ico 9

如果您正在寻找一个快速处理长文本的图书馆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 |
+------------+----------+
Run Code Online (Sandbox Code Playgroud)

我注意到很多方法都专注于短文本,可能是因为这是一个很难解决的问题:如果你有很多文本,那么检测语言真的很容易(例如,一个人可以只使用字典!)。然而,这使得很难找到一种简单且合适的方法来处理长文本。


alv*_*vas 8

@Rabash 在/sf/answers/3297476731/上有一个很好的工具列表

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

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

语言识别软件 使用人 开源/模型 基于规则 基于统计 可以训练/调整
谷歌翻译语言检测 TextBlob(有限使用) ? —— —— ?
夏代特 —— ? ? ? ?
Guess Language(非主动开发) 精神猜测(更新重写) ? ? 最低限度 ?
pyCLD2 多语言 ? 有些 ? 没有把握
CLD3 —— ? ? ? 可能
懒洋洋的 —— ? 没有把握 ? ?
语言检测 SpaCy-langdetect ? ? ? ?
快速文本 什么郎 ? ? ? 不确定

  • 感谢您的回答,根据您的经验,哪一个可以提供最准确/快速的结果来检测用英语编写的句子? (2认同)

Hab*_*ian 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)
Run Code Online (Sandbox Code Playgroud)


th3*_*h31 5

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

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

安装:

$ pip install googletrans
Run Code Online (Sandbox Code Playgroud)

语言检测:

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

  • 这个方法很棒,但我已经将其商业化,它不稳定,因为在 1-5K 转换后你必须更改你的 IP 地址。通过使用代理列表或在代码中 100 次转换后自动 VPN 更改,可以使该接口变得有用,我希望这对尝试实现此功能的任何人有所帮助。:) (3认同)