如何确定一段文字的语言?
- 2025-02-21 08:48:00
- admin 原创
- 29
问题描述:
我想要得到这个:
Input text: "ру́сский язы́к"
Output text: "Russian"
Input text: "中文"
Output text: "Chinese"
Input text: "にほんご"
Output text: "Japanese"
Input text: "العَرَبِيَّة"
Output text: "Arabic"
我怎样才能用 python 来做到这一点?
解决方案 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,从这里获取适当版本的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
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
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
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:
你可以安装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 = """\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-cffi | 2020 |
语言检测 | 2021 |
pycld3 | 2021 |
pycld2 | 2022 |
快文 | 2024 |
lingua-py | 2024 |
py-googletrans | 2025 |
文本块 | 2025 |
沙尔代 | 2025 |