A small tool for language and author identification of textfiles. More ore less a proof-of-concept of an article that I found in 2002 on "Heise Newsticker". For more informations visit:
http://www.heise.de/newsticker/data/wst-28.01.02-003/ http://xxx.uni-augsburg.de/format/cond-mat/0108530
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | # -*- coding: Latin-1 -*-
import zlib
class Entropy:
def __init__(self):
self.entro = []
def register(self, name, corpus):
"""
register a text as corpus for a language or author.
<name> may also be a function or whatever you need
to handle the result.
"""
corpus = str(corpus)
ziplen = len(zlib.compress(corpus))
self.entro.append((name, corpus, ziplen))
def guess(self, part):
"""
<part> is a text that will be compared with the registered
corpora and the function will return what you defined as
<name> in the registration process.
"""
what = None
diff = 0
part = str(part)
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<diff:
what = name
diff = nz
return what
if __name__=="__main__":
# Very basic example
e = Entropy()
# Create corpus
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.
""")
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 ...
""")
# 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.
""")
|
The trick here is that zip compresses better if content is very similar. If you have a big corpus of e.g. an english text and you append some text probes an english text probe will result in a better compression than a probe in an other language.
Any idea on the accuracy? The method sounds crude. Any idea on the accuracy?
The program TextCat sounds like a promising tool.
http://odur.let.rug.nl/~vannoord/TextCat/
TextCat is an implementation of the text categorization algorithm presented in Cavnar, W. B. and J. M. Trenkle, ``N-Gram-Based Text Categorization'' In Proceedings of Third Annual Symposium on Document Analysis and Information Retrieval, Las Vegas, NV, UNLV Publications/Reprographics, pp. 161-175, 11-13 April 1994.
accuracy. Seems to work fine with long texts. A good base for comparison is important, e.g. the charta of human rights or the bible that is translated in almost all languages.