我遇到的情况是我正在阅读一串文字,我需要检测语言代码(en,de,fr,sp等)。
在python中有一种简单的方法吗?
答案 0 :(得分:12)
如果您需要检测语言以响应用户操作,则可以使用google ajax language API:
#!/usr/bin/env python
import json
import urllib, urllib2
def detect_language(text,
userip=None,
referrer="http://stackoverflow.com/q/4545977/4279",
api_key=None):
query = {'q': text.encode('utf-8') if isinstance(text, unicode) else text}
if userip: query.update(userip=userip)
if api_key: query.update(key=api_key)
url = 'https://ajax.googleapis.com/ajax/services/language/detect?v=1.0&%s'%(
urllib.urlencode(query))
request = urllib2.Request(url, None, headers=dict(Referer=referrer))
d = json.load(urllib2.urlopen(request))
if d['responseStatus'] != 200 or u'error' in d['responseData']:
raise IOError(d)
return d['responseData']['language']
print detect_language("Python - can I detect unicode string language code?")
en
默认限制为100000个字符/天(一次不超过5000个)。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import urllib, urllib2
from operator import itemgetter
def detect_language_v2(chunks, api_key):
"""
chunks: either string or sequence of strings
Return list of corresponding language codes
"""
if isinstance(chunks, basestring):
chunks = [chunks]
url = 'https://www.googleapis.com/language/translate/v2'
data = urllib.urlencode(dict(
q=[t.encode('utf-8') if isinstance(t, unicode) else t
for t in chunks],
key=api_key,
target="en"), doseq=1)
# the request length MUST be < 5000
if len(data) > 5000:
raise ValueError("request is too long, see "
"http://code.google.com/apis/language/translate/terms.html")
#NOTE: use POST to allow more than 2K characters
request = urllib2.Request(url, data,
headers={'X-HTTP-Method-Override': 'GET'})
d = json.load(urllib2.urlopen(request))
if u'error' in d:
raise IOError(d)
return map(itemgetter('detectedSourceLanguage'), d['data']['translations'])
现在你可以request detecting a language explicitly:
def detect_language_v2(chunks, api_key):
"""
chunks: either string or sequence of strings
Return list of corresponding language codes
"""
if isinstance(chunks, basestring):
chunks = [chunks]
url = 'https://www.googleapis.com/language/translate/v2/detect'
data = urllib.urlencode(dict(
q=[t.encode('utf-8') if isinstance(t, unicode) else t
for t in chunks],
key=api_key), doseq=True)
# the request length MUST be < 5000
if len(data) > 5000:
raise ValueError("request is too long, see "
"http://code.google.com/apis/language/translate/terms.html")
#NOTE: use POST to allow more than 2K characters
request = urllib2.Request(url, data,
headers={'X-HTTP-Method-Override': 'GET'})
d = json.load(urllib2.urlopen(request))
return [sorted(L, key=itemgetter('confidence'))[-1]['language']
for L in d['data']['detections']]
示例:
print detect_language_v2(
["Python - can I detect unicode string language code?",
u"матрёшка",
u"打水"], api_key=open('api_key.txt').read().strip())
[u'en', u'ru', u'zh-CN']
答案 1 :(得分:6)
尝试确定所选Unicode(utf-8)文本的自然语言。
但正如名字所说,它猜测了语言。您不能指望100%正确的结果。
修改:
猜测语言是无法维护的。但是有一个fork(支持python3):guess_language-spirit
答案 2 :(得分:5)
查看Natural Language Toolkit和Automatic Language Identification using Python的想法。
我想知道贝叶斯过滤器是否可以使语言正确,但我现在无法编写概念证明。
答案 3 :(得分:5)
在我的情况下,我只需要确定两种语言,所以我只检查第一个字符:
<h1>
答案 4 :(得分:3)
A useful article这里表明this open source named CLD是在python中检测语言的最佳选择。
本文展示了3种解决方案之间的速度和准确性比较:
我浪费了langdetect
的时间,现在转换为CLD
,比langdetect
快16倍,准确度达到98.8%
答案 5 :(得分:1)
尝试Universal Encoding Detector
从Firefox到Python的chardet
模块的端口。
答案 6 :(得分:-2)
如果您只有有限数量的可能语言,您可以使用每种语言的一组词典(可能只包括最常用的词),然后根据词典检查输入中的词语。