Python - 我可以检测unicode字符串语言代码吗?

时间:2010-12-28 12:21:11

标签: python unicode internationalization detection

我遇到的情况是我正在阅读一串文字,我需要检测语言代码(en,de,fr,sp等)。

在python中有一种简单的方法吗?

7 个答案:

答案 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

Google Translate 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'])

现在你可以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)

查看guess-language

  

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

但正如名字所说,它猜测了语言。您不能指望100%正确的结果。

修改:

猜测语言是无法维护的。但是有一个fork(支持python3):guess_language-spirit

答案 2 :(得分:5)

查看Natural Language ToolkitAutomatic Language Identification using Python的想法。

我想知道贝叶斯过滤器是否可以使语言正确,但我现在无法编写概念证明。

答案 3 :(得分:5)

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

<h1>

答案 4 :(得分:3)

A useful article这里表明this open source named CLD是在python中检测语言的最佳选择。

本文展示了3种解决方案之间的速度和准确性比较:

  1. language-detection或其python端口langdetect
  2. Tika
  3. Chromium Language Detection (CLD)
  4. 我浪费了langdetect的时间,现在转换为CLD,比langdetect快16倍,准确度达到98.8%

答案 5 :(得分:1)

尝试Universal Encoding Detector从Firefox到Python的chardet模块的端口。

答案 6 :(得分:-2)

如果您只有有限数量的可能语言,您可以使用每种语言的一组词典(可能只包括最常用的词),然后根据词典检查输入中的词语。