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

2025-02-21 08:48:00
admin
原创
29
摘要:问题描述:我想要得到这个:Input text: "ру́сский язы́к" Output text: "Russian" Input text: "中文" Output text: "Chinese" Input ...

问题描述:

我想要得到这个:

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

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

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

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

我怎样才能用 python 来做到这一点?


解决方案 1:

  1. TextBlob . (已弃用 - 改用官方 Google Translate API)

需要 NLTK 包,使用 Google。

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

pip install textblob

注意:此解决方案需要互联网访问,并且 Textblob通过调用 API使用Google 翻译的语言检测器。

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

注意:Polyglot 正在使用pycld2,详情请参阅https://github.com/aboSamoor/polyglot/blob/master/polyglot/detect/base.py#L72

3.沙尔代

如果字符字节在范围内(127-255],Chardet 还具有检测语言的功能:

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

pip install chardet

  1. langdetect

需要大量文本。它在底层使用非确定性方法。这意味着对于相同的文本样本,您会得到不同的结果。文档说您必须使用以下代码来确定:

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

pip install langdetect

5.猜测语言

可以使用带有字典的拼写检查器来检测非常短的样本。

pip install guess_language-spirit

6.忧郁

langid.py 提供了一个模块

import langid
langid.classify("This is a test")
# ('en', -54.41310358047485)

以及一个命令行工具:

$ langid < README.md

pip install langid

7.FastText​

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

  1. pyCLD3

pycld3 是一个用于语言识别的神经网络模型。该包包含推理代码和已训练好的模型。

import cld3
cld3.get_language("影響包含對氣候的變化以及自然資源的枯竭程度")

LanguagePrediction(language='zh', probability=0.999969482421875, is_reliable=True, proportion=1.0)

pip install pycld3

解决方案 2:

你看过langdetect吗?

from langdetect import detect

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

print lang
#output: de

解决方案 3:

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

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

以下是对上述精彩答案的总结(截至 2021 年)

语言识别软件用户开源/模型基于规则基于统计数据可以训练/调整
谷歌翻译语言检测TextBlob(限制使用)--
沙尔代-
猜测语言(非活跃开发)spirit-guess (更新重写)最低限度
pyCLD2通晓多种语言有些没有把握
慢性肝病3-有可能
朗吉德皮-没有把握
语言检测SpaCy-langdetect
快文什么郎没有把握

解决方案 4:

如果您正在寻找一个能够快速处理长文本的图书馆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 |
+------------+----------+

我注意到很多方法都侧重于短文本,可能是因为这个问题很难解决:如果你有大量文本,那么检测语言就很容易了(例如,只需使用字典即可​​!)。然而,这使得很难找到一种简单且适合长文本的方法。

解决方案 5:

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)

解决方案 6:

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

你可以提出任意数量的请求,没有限制

安装:

$ pip install googletrans

语言检测:

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

解决方案 7:

我会说lingua.py是最好的。它比 更快、更准确fasttext。绝对值得在这里列出。

安装

poetry 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

解决方案 8:

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

方法 0:使用 API 或库

  • cld2-cffi

  • Google 云翻译 - 基础版 (v2)

  • 文本块

  • 语言检测

  • ETC。

通常,这些库都存在一些问题,因为有些库对于小文本不准确、缺少某些语言、速度慢、需要互联网连接、不免费......但一般来说,它们可以满足大多数需求。

方法 1:语言模型

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

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

如果你想为此建立一个简单的语言模型,我会选择 1-gram。为此,你只需要计算大文本(例如“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),然后测量相对于参考压缩文本(目标语言)的压缩距离。就我个人而言,我不喜欢这种方法,因为它比其他方法更慢、更不准确、描述性更差。不过,这种方法可能有一些有趣的应用。阅读更多:语言树和压缩

解决方案 9:

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

我带着非常相似的需求来回答你的问题。我发现 Rabash 的回答对我的特定需求最有帮助。

经过试验,找到了他建议中最有效的方法,即确保 60,000 多个文本文件中的文本文件都是英文的,我发现 fasttext 是完成此类任务的绝佳工具。

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

我的代码和注释是这篇文章的答案之一。我相信您和其他人可以轻松修改此代码以满足其他特定需求。

解决方案 10:

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

解决方案 11:

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

对我有用的解决方案(我使用的是 Windows 10)是安装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))

解决方案 12:

我喜欢 TextBlob 提供的语言检测方法。它非常简单易用,而且代码行数更少。在开始之前,您需要安装 textblob python 库才能使以下代码运行。

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

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

解决方案 13:

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

解决方案 14:

如果您要检测的语言属于这些...

  • 阿拉伯语(ar)

  • 保加利亚语 (bg)

  • 德语 (de)

  • 现代希腊语(el)

  • 英语 (en)

  • 西班牙语(es)

  • 法语 (fr)

  • 印地语 (hi)

  • 意大利语 (它)

  • 日语 (ja)

  • 荷兰语(nl)

  • 波兰语(pl)

  • 葡萄牙语 (pt)

  • 俄语 (ru)

  • 斯瓦希里语 (sw)

  • 泰语(th)

  • 土耳其语 (tr)

  • 乌尔都语 (ur)

  • 越南语(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%

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

解决方案 15:

你可以安装pycld2python库

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 = """\nFrance 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 库是 Compact Language Detect 2 (CLD2) 的 Python 绑定。您可以探索 Pycld2 的不同功能。在此了解有关 Pycld2 的信息。

解决方案 16:

确定文本语言的最佳方法是实现以下函数:

from langdetect import detect

def get_language(text):

    keys =['ab', 'aa', 'af', 'ak', 'sq', 'am', 'ar', 'an', 'hy', 'as', 'av', 'ae', 'ay', 'az', 'bm', 'ba', 'eu', 'be', 'bn', 'bi', 'bs', 'br', 'bg', 'my', 'ca', 'ch', 'ce', 'ny', 'zh', 'cu', 'cv', 'kw', 'co', 'cr', 'hr', 'cs', 'da', 'dv', 'nl', 'dz', 'en', 'eo', 'et', 'ee', 'fo', 'fj', 'fi', 'fr', 'fy', 'ff', 'gd', 'gl', 'lg', 'ka', 'de', 'el', 'kl', 'gn', 'gu', 'ht', 'ha', 'he', 'hz', 'hi', 'ho', 'hu', 'is', 'io', 'ig', 'id', 'ia', 'ie', 'iu', 'ik', 'ga', 'it', 'ja', 'jv', 'kn', 'kr', 'ks', 'kk', 'km', 'ki', 'rw', 'ky', 'kv', 'kg', 'ko', 'kj', 'ku', 'lo', 'la', 'lv', 'li', 'ln', 'lt', 'lu', 'lb', 'mk', 'mg', 'ms', 'ml', 'mt', 'gv', 'mi', 'mr', 'mh', 'mn', 'na', 'nv', 'nd', 'nr', 'ng', 'ne', 'no', 'nb', 'nn', 'ii', 'oc', 'oj', 'or', 'om', 'os', 'pi', 'ps', 'fa', 'pl', 'pt', 'pa', 'qu', 'ro', 'rm', 'rn', 'ru', 'se', 'sm', 'sg', 'sa', 'sc', 'sr', 'sn', 'sd', 'si', 'sk', 'sl', 'so', 'st', 'es', 'su', 'sw', 'ss', 'sv', 'tl', 'ty', 'tg', 'ta', 'tt', 'te', 'th', 'bo', 'ti', 'to', 'ts', 'tn', 'tr', 'tk', 'tw', 'ug', 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'cy', 'wo', 'xh', 'yi', 'yo', 'za', 'zu']
    
    langs = ['Abkhazian', 'Afar', 'Afrikaans', 'Akan', 'Albanian', 'Amharic', 'Arabic', 'Aragonese', 'Armenian', 'Assamese', 'Avaric', 'Avestan', 'Aymara', 'Azerbaijani', 'Bambara', 'Bashkir', 'Basque', 'Belarusian', 'Bengali', 'Bislama', 'Bosnian', 'Breton', 'Bulgarian', 'Burmese', 'Catalan, Valencian', 'Chamorro', 'Chechen', 'Chichewa, Chewa, Nyanja', 'Chinese', 'Church Slavonic, Old Slavonic, Old Church Slavonic', 'Chuvash', 'Cornish', 'Corsican', 'Cree', 'Croatian', 'Czech', 'Danish', 'Divehi, Dhivehi, Maldivian', 'Dutch, Flemish', 'Dzongkha', 'English', 'Esperanto', 'Estonian', 'Ewe', 'Faroese', 'Fijian', 'Finnish', 'French', 'Western Frisian', 'Fulah', 'Gaelic, Scottish Gaelic', 'Galician', 'Ganda', 'Georgian', 'German', 'Greek, Modern (1453–)', 'Kalaallisut, Greenlandic', 'Guarani', 'Gujarati', 'Haitian, Haitian Creole', 'Hausa', 'Hebrew', 'Herero', 'Hindi', 'Hiri Motu', 'Hungarian', 'Icelandic', 'Ido', 'Igbo', 'Indonesian', 'Interlingua (International Auxiliary Language Association)', 'Interlingue, Occidental', 'Inuktitut', 'Inupiaq', 'Irish', 'Italian', 'Japanese', 'Javanese', 'Kannada', 'Kanuri', 'Kashmiri', 'Kazakh', 'Central Khmer', 'Kikuyu, Gikuyu', 'Kinyarwanda', 'Kirghiz, Kyrgyz', 'Komi', 'Kongo', 'Korean', 'Kuanyama, Kwanyama', 'Kurdish', 'Lao', 'Latin', 'Latvian', 'Limburgan, Limburger, Limburgish', 'Lingala', 'Lithuanian', 'Luba-Katanga', 'Luxembourgish, Letzeburgesch', 'Macedonian', 'Malagasy', 'Malay', 'Malayalam', 'Maltese', 'Manx', 'Maori', 'Marathi', 'Marshallese', 'Mongolian', 'Nauru', 'Navajo, Navaho', 'North Ndebele', 'South Ndebele', 'Ndonga', 'Nepali', 'Norwegian', 'Norwegian Bokmål', 'Norwegian Nynorsk', 'Sichuan Yi, Nuosu', 'Occitan', 'Ojibwa', 'Oriya', 'Oromo', 'Ossetian, Ossetic', 'Pali', 'Pashto, Pushto', 'Persian', 'Polish', 'Portuguese', 'Punjabi, Panjabi', 'Quechua', 'Romanian, Moldavian, Moldovan', 'Romansh', 'Rundi', 'Russian', 'Northern Sami', 'Samoan', 'Sango', 'Sanskrit', 'Sardinian', 'Serbian', 'Shona', 'Sindhi', 'Sinhala, Sinhalese', 'Slovak', 'Slovenian', 'Somali', 'Southern Sotho', 'Spanish, Castilian', 'Sundanese', 'Swahili', 'Swati', 'Swedish', 'Tagalog', 'Tahitian', 'Tajik', 'Tamil', 'Tatar', 'Telugu', 'Thai', 'Tibetan', 'Tigrinya', 'Tonga (Tonga Islands)', 'Tsonga', 'Tswana', 'Turkish', 'Turkmen', 'Twi', 'Uighur, Uyghur', 'Ukrainian', 'Urdu', 'Uzbek', 'Venda', 'Vietnamese', 'Volapük', 'Walloon', 'Welsh', 'Wolof', 'Xhosa', 'Yiddish', 'Yoruba', 'Zhuang, Chuang', 'Zulu']
    
    lang_dict = {key : lan for (key, lan) in zip(keys, langs)}
    
    return lang_dict[detect(text)]

让我们尝试一下:

>>> get_language("Ich liebe meine Frau")

... 'German'

解决方案 17:

上面提到的许多图书馆现在似乎已被废弃。

自由党最后提交
猜测语言2016
兰吉德2017
多语种2020
cld2-cffi2020
语言检测2021
pycld32021
pycld22022
快文2024
lingua-py2024
py-googletrans2025
文本块2025
沙尔代2025
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1343  
  信创产业的蓬勃发展推动着各行业数字化转型加速,数据库迁移作为其中关键一环,面临诸多挑战。信创数据库迁移旨在将传统数据库平稳过渡到信创环境,以满足自主可控、安全可靠的需求。这一过程涉及技术、业务等多方面因素,稍有不慎就可能出现各种问题,影响业务的正常运行。深入探讨信创数据库迁移过程中的常见问题及解决方案,对于保障迁移工作...
2027年信创国产化   41  
  随着信息技术的飞速发展,信创国产化成为了国家战略的重要组成部分。国产化信创产品名录涵盖了众多领域,其在各个关键应用场景中发挥着重要作用。而信创国产化操作系统作为其中的核心环节,具备五大核心优势,为我国信息技术产业的自主可控发展提供了坚实支撑。关键应用场景之办公领域在办公领域,国产化信创产品有着广泛且深入的应用。如今,越...
国产信创系统   37  
  随着信息技术的飞速发展,信创国产化操作系统在政府部门的推广应用具有重要的战略意义。它不仅关乎国家信息安全,更是推动国内信息技术产业自主创新、实现科技自立自强的关键举措。在当前复杂的国际形势下,政府部门积极推广信创国产化操作系统,对于保障国家政务信息的安全稳定运行,提升信息技术的自主可控能力,具有不可替代的重要作用。推广...
信创产品有哪些   28  
  在企业数字化转型的进程中,信创数据库解决方案的选择至关重要。它不仅关乎企业数据的安全存储与管理,更影响着企业业务的稳定运行与未来发展。合适的信创数据库能够助力企业在复杂多变的市场环境中提升竞争力,保障数据主权与安全。然而,面对市场上众多的信创数据库产品和解决方案,企业往往感到困惑,不知如何做出正确的选择。接下来,我们将...
信创电脑   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用