信息熵的优雅应用 设别语言

意大利科学家发现的一种优雅的方法识别文本语言及作者。

罗马大学的Dariao Benedetto、Emanuele Caglioti和Vittorio Loreto在《物理评论快报》杂志上描述了一种方法,即使用通常用于文件压缩的Lempel-Ziv算法可以用于语言识别。

压缩文本长度与未压缩文本长度之比趋向于文本字符流的熵

该算法在压缩时建立一个已知字符序列的词典。如果文本中重复出现这样的字符序列,则只引用词典中的相应条目。

研究人员比较了10种不同欧洲语言中的文本段。他们首先压缩一个已知的字符序列,然后将要比较的文本片段添加到原始序列中,并压缩这个文件。

两个压缩字符序列长度之差给出了两个原始字符序列的相似程度的量度——只有当两个文本的语言相同时,长度差最小。

该方法可以可靠工作至只有20个字符的最小长度。这种方法可以用93%的概率识别文本作者。

在3个测试用例的实验中,研究人员试图使用该方法对语言进行分类。

import zlib

class Entropy:

    def __init__(self):
        self.entro = []

    def register(self, name, corpus):
        """
        register a text as corpus for a language or author.
         may also be a function or whatever you need
        to handle the result.
        "
""
        #corpus = str(corpus)
        corpus = bytes(corpus, encoding='utf-8')
        ziplen = len(zlib.compress(corpus))
        self.entro.append((name, corpus, ziplen))

    def guess(self, part):
        """
         is a text that will be compared with the registered
        corpora and the function will return what you defined as
         in the registration process.
        "
""
        what = None
        diff = 0
        part = str(part)
        part = bytes(part, encoding='utf-8')
        for name, corpus, ziplen in self.entro:
            nz = len(zlib.compress(corpus + part)) - ziplen
            # print name, nz, ziplen, nz-ziplen, (1.0 * (nz-ziplen)) / len(part)
            if diff==0 or nz                what = name
            diff = nz
        return what


if __name__=="__main__":

    # Very basic example

    e = Entropy()

    # 语料库 喂料
    # 喂3种料:英文,荷兰语和中文

1、英文语料:

    e.register("english","""
    If you ever wrote a large shell script, you probably know this feeling:
    you'd love to add yet another feature, but it's already so slow, and so
    big, and so complicated; or the feature involves a system call or other
    function that is only accessible from C ...Usually the problem at hand
    isn't serious enough to warrant rewriting the script in C; perhaps the
    problem requires variable-length strings or other data types (like sorted
    lists of file names) that are easy in the shell but lots of work to
    implement in C, or perhaps you're not sufficiently familiar with C.
    "
"")

2、荷兰语料

    e.register("deutsch","""
    Über spirito (http://www.spirito.de) Die spirito GmbH mit Sitz in Duisburg
    ist Dienstleister im Bereich maßgeschneiderte Programmierung für Internet
    und Intranet sowie Hersteller von
    Software für Content Management, Groupware, E-Learning und Online Shops.
    Unsere Philosophie Wenn Sie uns mit einem Projekt beauftragen, so sollen Sie
    dabei nicht nur ein «Gutes Gefühl» haben, Sie sollen sich wohlfühlen! Die
    Anwendung unserer Software soll Leichtigkeit vermitteln, Freude, Witz und
    Geist versprühen. Daher nennen wir uns «spirito», was im Italienischen
    soviel bedeutet wie Geist / Witz / Kreativität. Unsere Produkte haben wir
    nach italienischen Städten benannt, weil wir denken, dass das allein schon
    eine gewisse Leichtigkeit vermittelt. Diese Produkte liefern so manche
    Vorlage für die Ausgestaltung konkreter Projekte. Aufgrund der sehr hohen
    Flexibilität aller unserer Produkte fällt uns die punktgenaue Anpassung
    unserer Produkte an Ihre Wünsche besonders leicht. Schließlich sollen es
    auch diejenigen, die nachher damit arbeiten müssen besonders leicht haben.
    Die schweren und die langweiligen Dinge wollen wir so weit wie möglich der
    Software überlassen ...
    "
"")

3、中文语料

    e.register("中文",
    """
    意大利科学家发现的一种优雅的方法识别文本语言及作者。
    罗马大学的Dariao Benedetto、Emanuele Caglioti和
    Vittorio Loreto在《物理评论快报》杂志上描述了一种方法,
    即使用通常用于文件压缩的`Lempel-Ziv`算法可以用于语言识别。    
    **压缩文本长度与未压缩文本长度之比趋向于文本字符流的熵**。
    
    该算法在压缩时建立一个已知字符序列的词典。如果文本中重复出现
    这样的字符序列,则只引用词典中的相应条目。
    
    研究人员比较了10种不同欧洲语言中的文本段。他们首先压缩一个已
    知的字符序列,然后将要比较的文本片段添加到原始序列中,并压缩这个文件。
    
    两个压缩字符序列长度之差给出了两个原始字符序列的相似程度的量度——
    只有当两个文本的语言相同时,长度差最小。
    
    该方法可以可靠工作至只有20个字符的最小长度。这种方法可以用93%的
    概率识别文本作者。
    
    在第三个实验中,研究人员试图使用该方法对语言进行分类。因“人权宣言”
    的表述在很多语言中可用,他们使用它来构建50种语言的语树,与语言学家
    构建的系统惊人地相似。
    
    科学家们对将该方法应用于文本之外的DNA和蛋白质序列也持乐观态度。
    "
"")

开始测试 ... ...

输入需要判断的原文:

    # Test some probes

    print ("DEUTSCH", e.guess("""
    Laut Kundenaussagen ist XYZ unter Windows 95 A und B sowie unter Windows
    NT einsatzfähig. Leider kann von unserer Seite aus unter diesen
    Betriebssystemen kein umfassender Support gewährleistet werden.
    "
""))

    print ("ENGLISH", e.guess("""
    Now that you are all excited about Python, you'll want to examine
    it in some more detail. Since the best way to learn a language is
    using it, you are invited here to do so.
    "
""))

    print("what?",e.guess("""    
    因果方法与传统机器学习和统计相比提出了独特的挑战。学习因果关系可能具有挑战性,
    但它提供了纯统计思维所不能及的独特优势。    
    "
""))

输出结果:

DEUTSCH deutsch
ENGLISH english
what? 中文

因“人权宣言”的表述在很多语言中可用,他们使用它来构建50种语言的语树,与语言学家构建的系统惊人地相似。

科学家们对将该方法应用于文本之外的DNA和蛋白质序列也持乐观态度。

本文由 mdnice 多平台发布

你可能感兴趣的:(后端)