我可以检测Unicode字符串的语言代码吗?

15
我面临一个情况,我正在阅读一串文本,我需要检测语言代码(en、de、fr、es等)。
在Python中有没有简单的方法可以做到这一点?

我已经编写了一个代码来检测脚本。然而,这将无法区分具有相同脚本的语言(如en、fr、es)。 - Ritwik
7个回答

13
如果您需要在响应用户操作时检测语言,则可以使用Google Ajax语言API进行检测:(链接)
#!/usr/bin/env python
import json
import urllib, urllib2

def detect_language(text,
    userip=None,
    referrer="https://dev59.com/ym855IYBdhLWcg3wFAHy",
    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

Google翻译API v2

默认限制每天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'])

现在您可以明确请求检测语言:点击此处
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:巧妙地利用了一些好的现有工具的能力。 - Eric O. Lebigot
1
@ShimonDoodkin:你可以尝试来自不同提供商的类似服务,例如microsoft-translate.py - jfs

7
在我的情况下,我只需要确定两种语言,所以我只检查第一个字符:
import unicodedata

def is_greek(term):
    return 'GREEK' in unicodedata.name(term.strip()[0])


def is_hebrew(term):
    return 'HEBREW' in unicodedata.name(term.strip()[0])

6
请看一下 guess-language

尝试确定Unicode(utf-8)文本的自然语言。

但正如名字所说,它只是猜测语言。您不能期望100%正确的结果。 编辑: guess-language已经停止维护。但有一个支持python3的分支:guess_language-spirit

5

3

你知道 langdetect 在你回答这个问题后有没有得到改善吗? - Glen Thompson

1

这是一个不错的库,但它给了我编码而不是语言环境,这对我没有用。不过还是谢谢。 - sa125
你可以将编码映射到语言环境。 - ismail
1
@İsmail 'cartman' Dönmez:只有当语言具有自己的字符集时才可能实现。许多语言共享相同的字母表。ASCII映射到哪个区域设置? - pafcu
1
我假设sa125指的是语言,而不是区域设置。 - pafcu
@dan04:ASCII是为“en_US”设计的,但这并不意味着它在其他地方不被使用。仅仅因为一个文本是用ASCII码编写的,并不意味着它是用美式英语书写的。 - pafcu
显示剩余4条评论

-1

如果你只有有限的语言选择,你可以使用每种语言的一组字典(可能仅包括最常见的单词),然后检查输入中的单词是否在这些字典中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接