我想得到这个:
Input text: "ру́сский язы́к"
Output text: "Russian"
Input text: "中文"
Output text: "Chinese"
Input text: "にほんご"
Output text: "Japanese"
Input text: "العَرَبِيَّة"
Output text: "Arabic"
如何在python中完成?谢谢。
我想得到这个:
Input text: "ру́сский язы́к"
Output text: "Russian"
Input text: "中文"
Output text: "Chinese"
Input text: "にほんご"
Output text: "Japanese"
Input text: "العَرَبِيَّة"
Output text: "Arabic"
如何在python中完成?谢谢。
Answers:
您看过langdetect吗?
from langdetect import detect
lang = detect("Ein, zwei, drei, vier")
print lang
#output: de
ro
(罗马尼亚语)。在这种情况下需要多种语言输出。多语言的性能要好得多。
langdetect
,可以确定不同的语言:-)
TextBlob。需要NLTK软件包,使用Google。
from textblob import TextBlob
b = TextBlob("bonjour")
b.detect_language()
pip install textblob
多种语言。需要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
如果字符字节的范围在(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
guess_language可以通过将此拼写检查器与字典一起使用来检测非常短的样本。
pip install guess_language-spirit
langid提供了两个模块
import langid
langid.classify("This is a test")
# ('en', -54.41310358047485)
和命令行工具:
$ langid < README.md
pip install langid
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是用于语言识别的神经网络模型。该软件包包含推理代码和训练有素的模型。
import cld3
cld3.get_language("影響包含對氣候的變化以及自然資源的枯竭程度")
LanguagePrediction(language='zh', probability=0.999969482421875, is_reliable=True, proportion=1.0)
pip install pycld3
detectlang
比Textblob
polyglot
最终成为我的用例中性能最高的。langid
第二名
有有一个问题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
。有什么建议么?
dask
,否则不会有任何区别。
如果您正在寻找使用长文本的快速图书馆,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
,并不是全部都那么快。还是有一种方法可以使用它以一种批处理模式识别语言?我只尝试逐句处理。
\n
字符,但对于多语种则不必删除(cdl2结果几乎相同,我也对其进行了测试)。我不明白为什么您会说多语种很慢,这是最快的。您是否认为我也应该删除\n
,并且我的结果仅反映了第一句话(即,在第一句话之前\n
)
根据情况,您可能会对使用以下方法之一感兴趣:
方法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距离。就我个人而言,我不喜欢它,因为它比其他方法更慢,更不准确且更具描述性。但是,此方法可能会有有趣的应用。阅读更多内容:语言树和压缩
您可以使用Googletrans(非官方)免费且无限制的Python Python翻译API。
您可以根据需要发出任意数量的请求,没有限制
安装:
$ pip install googletrans
语言检测:
>>> from googletrans import Translator
>>> t = Translator().detect("hello world!")
>>> t.lang
'en'
>>> t.confidence
0.8225234