如何确定一段文本的语言?

我想得到这个:

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


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


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


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

我怎么能在 Python 里做到呢?

145205 次浏览

你看过 长探测器了吗?

from langdetect import detect


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


print lang
#output: de

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

1. TextBlob.

需要 NLTK 包,使用 Google。

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

pip install textblob

注: 此解决方案需要互联网接入,Textblob 正在使用 通过调用 API,谷歌翻译的语言检测器

2. 通晓多国语言.

需要 numpy 和一些神秘的库,不太可能在 Windows 上运行。(对于 Windows,从 给你中获取适当版本的 重症监护室教授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

pip install polyglot

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

注意: Polyglot 使用的是 pycld2,详见 https://github.com/aboSamoor/polyglot/blob/master/polyglot/detect/base.py#L72

3. Chardet

Chardet 还有一个特性,如果在范围(127-255)内有字符字节,它可以检测语言:

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

pip install chardet

4. 长探测器

需要大量的文本。它在引擎盖下使用非确定性方法。这意味着对于同一个文本示例,您会得到不同的结果。医生说你必须使用以下代码来确定:

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

pip install langdetect

5. 猜,语言

可以检测非常短的样本使用 这个拼写检查与字典。

pip install guess_language-spirit

6. 懒散

Py 同时提供了这两个模块

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

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)

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

我提出你的问题时也有同样的需要。我从拉巴什的回答中找到了最能满足我特殊需要的帮助。

在试验找到他的建议中最有效的方法——确保60,000多个文本文件中的文本文件是英文的——之后,我发现 Fast text 是完成这项任务的一个极好的工具。

通过一些工作,我得到了一个可以快速处理多个文件的工具。但是它可以很容易地为类似您的情况进行修改,因为 fast 文本可以很容易地在一个行列表上工作。

我的代码与注释是在 这个上的回答。我相信您和其他人可以很容易地修改此代码以满足其他特定需求。

根据具体情况,您可能有兴趣使用下列方法之一:

方法0: 使用 API 或库

通常情况下,这些图书馆有一些问题,因为其中一些不准确的小文本,一些语言是缺失的,是缓慢的,需要互联网连接,是非免费的,... 但一般来说,他们将适合大多数需求。

方法1: 语言模型

语言模型为我们提供了一系列单词的概率。这一点很重要,因为它允许我们鲁棒地检测文本的语言,即使文本包含其他语言的单词(例如: “你好”在西班牙语里是“你好”的意思”)。

您可以使用 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 距离。就我个人而言,我不喜欢它,因为它比其他方法更慢,更不准确,描述性也更差。不过,这种方法可能会有一些有趣的应用。 阅读更多: < a href = “ https://arxiv.org/abs/cond-mat/0108530”rel = “ nofollow noReferrer”> 语言树和压缩

如果你正在寻找 一个快速处理长文本的图书馆polyglotfastext是做最好的工作在这里。

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

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

我注意到很多方法都集中在短文本上,可能是因为这是一个很难解决的问题: 如果你有很多文本,那么很容易检测语言(例如,你可以直接使用字典.然而,这使得很难找到一种简单适用于长文本的方法。

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

你想要多少请求都可以,没有限制

安装:

$ pip install googletrans

语言检测:

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

我已经尝试了所有的库,并得出结论,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...)

@ Rabash 在 https://stackoverflow.com/a/47106810/610569上有一个很好的工具列表

而@toto _ tico 在展示速度比较方面做得很好。

以下是完成上述伟大答案的摘要(截至2021年)

语言识别软件 使用者 开放源码/模型 基于规则 基于统计数据 可以训练/调音
谷歌翻译语言检测 TextBlob (限制使用) Something - - Something
夏德 - Something Something
猜测语言 (非活动开发) 精神猜测 (更新重写) 最低限度 Something
PyCLD2 通晓多国语言 算是吧 不确定
CLD3 - Something 有可能
懒洋洋的 - 不确定
长探测器 太空探测器 Something
快讯 什么朗 Something 不确定

Polygot 或 Cld2是最好的建议之一,因为它们可以检测文本中的多种语言。但是,由于“建筑车轮故障”,它们不容易安装在 Windows 上。

对我有效的一个解决方案(我使用的是 Windows10)是安装 CLD2-CFFI

所以首先安装 cld2-cffi

pip install cld2-cffi

然后像这样使用它:

text_content = """ A accès aux chiens et aux frontaux qui lui ont été il peut
consulter et modifier ses collections et exporter Cet article concerne le pays
européen aujourd’hui appelé République française.
Pour d’autres usages du nom France, Pour une aide rapide et effective, veuiller
trouver votre aide dans le menu ci-dessus.
Welcome, to this world of Data Scientist. Today is a lovely day."""


import cld2


isReliable, textBytesFound, details = cld2.detect(text_content)
print('  reliable: %s' % (isReliable != 0))
print('  textBytes: %s' % textBytesFound)
print('  details: %s' % str(details))

输出如下:

reliable: True
textBytes: 377
details: (Detection(language_name='FRENCH', language_code='fr', percent=74,
score=1360.0), Detection(language_name='ENGLISH', language_code='en',
percent=25, score=1141.0), Detection(language_name='Unknown',
language_code='un', percent=0, score=0.0))

如果您想检测的语言是其中之一..。

  • 阿拉伯文(阿拉伯文)
  • 保加利亚语(bg)
  • 德语(德语)
  • 现代希腊语
  • 英文(en)
  • (西班牙语)
  • (法语)
  • 印度语(嗨)
  • (意大利语)
  • 日语(ja)
  • 荷兰语(nl)
  • 波兰语(pl)
  • 葡萄牙语(pt)
  • 俄语(俄语)
  • 斯瓦希里语
  • 泰国
  • (土耳其语)
  • 乌尔都语
  • 越南语(vi)
  • 中文(zh)

那么使用 HuggingFace 库和模型(深度学习自然语言处理,如果你不熟悉的话)就相对容易了:

# Import libraries
from transformers import pipeline
# Load pipeline
classifier = pipeline("text-classification", model = "papluca/xlm-roberta-base-language-detection")
# Example sentence
sentence1 = 'Ciao, come stai?'
# Get language
classifier(sentence1)

产出:

[{'label': 'it', 'score': 0.9948362112045288}]

label是预测语言,score是分配给它的分数: 你可以把它看作是一个置信度量。 一些细节:

训练集包含70k 个样本,同时验证和测试 每组10k,测试组的平均准确率为99.6%

你可以找到更多的信息 在模特的页面上,我想你可以找到其他适合你需要的型号。

您可以安装 pycld2 python 库

pip install pycld2

或者

python -m pip install -U pycld2

下面的代码工作。

import pycld2 as cld2


isReliable, textBytesFound, details = cld2.detect(
"а неправильный формат идентификатора дн назад"
)


print(isReliable)
# True
details[0]
# ('RUSSIAN', 'ru', 98, 404.0)


fr_en_Latn = """\
France is the largest country in Western Europe and the third-largest in Europe as a whole.
A accès aux chiens et aux frontaux qui lui ont été il peut consulter et modifier ses collections
et exporter Cet article concerne le pays européen aujourd’hui appelé République française.
Pour d’autres usages du nom France, Pour une aide rapide et effective, veuiller trouver votre aide
dans le menu ci-dessus.
Motoring events began soon after the construction of the first successful gasoline-fueled automobiles.
The quick brown fox jumped over the lazy dog."""


isReliable, textBytesFound, details, vectors = cld2.detect(
fr_en_Latn, returnVectors=True
)
print(vectors)
# ((0, 94, 'ENGLISH', 'en'), (94, 329, 'FRENCH', 'fr'), (423, 139, 'ENGLISH', 'en'))

Pycld2 python 库是用于 CompactLanguage Detect 2(CLD2)的 python 绑定。您可以探索 Pycld2的不同功能。了解 Pycld2 给你

我喜欢 TextBlob 提供的用于语言检测的方法。它非常简单,易于实现,并且使用较少的代码行。在你开始之前。您需要安装 textblob python 库才能使用下面的代码。

from textblob import TextBlob
text = "это компьютерный портал для гиков."
lang = TextBlob(text)
print(lang.detect_language())

另一方面,如果使用了多种语言的组合,那么可能需要尝试 pycld2,它通过精确定义句子或段落的各个部分来允许语言检测。

我会一直说 意大利面。它比 fasttext更快更准确。绝对值得列在这里。

安装

poety add lingua-language-detector

用法

from typing import List
from lingua.language import Language
from lingua.builder import LanguageDetectorBuilder
languages: List[Language] = [Language.ENGLISH, Language.TURKISH, Language.PERSIAN]
detector = LanguageDetectorBuilder.from_languages(*languages).build()


if __name__ == "__main__":
print(detector.detect_language_of("Ben de iyiyim. Tesekkurler.")) # Language.TURKISH
print(detector.detect_language_of("I'm fine and you?")) # Language.ENGLISH
print(detector.detect_language_of("حال من خوبه؟ شما چطورید؟")) # Language.PERSIAN