Source code for eWRT.stat.language

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
@package eWRT.stat.language

language detection
'''
import re
from glob import glob
from os.path import basename
import unittest

from eWRT.util.module_path import get_resource

[docs]def read_wordlist(fname): ''' reads a language wordlist from a file ''' with open(fname) as f: return set(map(str.lower, map(str.strip, f.readlines())))
# returns the language name based on the language file's name get_lang_name = lambda fname: basename(fname).split(".")[0] LANG_DATA_DIR = get_resource(__file__, 'data') ## # \var STOPWORD_DICT: a dictionary of the 100 most common words in the given language STOPWORD_DICT = {get_lang_name(fname): read_wordlist(fname) for fname in glob(LANG_DATA_DIR+"/*.csv")} DELETE_CHARS = {ch: None for ch in ",.!?\"'"}
[docs]def detect_language(text): ''' detects the most probable language for the given text ''' if not text.strip(): return None text = text.lower() text = re.sub(r'[^\w]', ' ', text) words = [word.strip() for word in text.translate(DELETE_CHARS).split(" ")] current_lang = None current_wordcount = 0 for lang, reference_wordlist in STOPWORD_DICT.items(): wordcount = sum([1 for word in words if word in reference_wordlist]) if wordcount >= current_wordcount and wordcount > 0: current_wordcount = wordcount current_lang = lang return current_lang
[docs]class DetectLanguageTest(unittest.TestCase):
[docs] def test_detect_language(self): ''' tests the language detection based on examples ''' text = u"#maryboo #health #baby #mom #food #cosmetics #love http://t.co/nPqzL8MRKa" #RT @LesbianGIFs_: She's HOT AF đŸ˜©đŸ”„ http://t.co/xZ2VFdAtNx print(detect_language(text)) text = u'''Das GlĂŒck der Erde liegt in diesem Fall im Dreck. Begeistert werfen sich die SchĂŒler einer zweiten Klasse Volksschule Erdklumpen auf die grĂŒnen T-Shirts. Andere rennen lachend herum, reißen verstohlen Sauerampfer aus dem Beet und stecken sich die BlĂ€tter in den Mund.''' print(detect_language(text)) assert detect_language(text) == 'de' text = u'''Deux nouveaux dĂ©cĂšs par crise cardiaque en lien avec la consommation de boissons Ă©nergisantes ont Ă©tĂ© signalĂ©s aux autoritĂ©s sanitaires, a indiquĂ© mercredi 6 juin au soir l'agence de sĂ©curitĂ© sanitaire pour l'alimentation (Anses).''' assert detect_language(text) == 'fr' text = u'''Weniger 1V-Renten, mehr Pensionskassengelder ZÜRICH. Immer weniger Leute beziehen eine IVunsere PensionskassenGuthaben: Sie wachsen. Seit 2003 ist die Zahl der jĂ€hrlich neu zugesprochenen Renten bei der Invalidenversicherung (IV) um mehr als 47% gesUnken. «Wir fĂŒhren das auf die 5. IVG-Revision, die relativ stabile Wirtschaftslage und die Fortschritte bei der Wiedereingliederung zurĂŒck», sagt Zurich-Sprecher Frank Keidel. Vom starken RĂŒckgang profitiert nicht nur die IV als erste SĂ€ule, sondern alle ErwerbstĂ€tigen. Denn dank der gesunkenen Zahl der Invaliden mĂŒssen auch die Pensionskassen weniger IV-RentenbeitrĂ€ge aus der zweiten SĂ€ule ausschĂŒtten. Unter dem Strich bleibt deshalb viel mehr Geld fĂŒr die Altersvorsorge. Die BeitrĂ€ge der zweiten SĂ€ule setzen sich zusammen aus IV-, Todesfall- und KostenprĂ€mie. Eine Umfrage von 20 Minuten bei den Versicherungen zeigt, dass die RisikoprĂ€mten fĂŒr InvaliditĂ€t teils um 10 bis 20% gesenkt werden konnten. «Oberdurchschnittlich konnten wIr 2011 die PrĂ€mien im Gross- und Detailhandel, bei Optikern, Apotheken und Drogerien senken», so Allianz-Suisse-SprecherBernddeWall. Ebenfalls stark profitiert hĂ€tten Elektro-, SanitĂ€r- und LĂŒftungsinstallateure, Maler, Gipser und Glaser Bei Swlss Life sanken die PrĂ€mien seit 2007 durchschnittlich um %. Auch Axa Wmterthur hat in den letzten Jahren die Taufe bereits dreimal gesenkt. Und mit der teilautonomen Sanimelstiftung Vita plant sie fĂŒr 2013 eine durchschnittliche r? /2 1 1 IV-Renten sind rOckilufig. FOTOLIA Senkung der PrĂ€mien von rund 300 Franken pro versicherte Person. ELISABEflI RIZZI''' assert detect_language(text) == 'de'
[docs] def test_exceptions(self): ''' results for empyt strings ''' assert detect_language(u" ") == None assert detect_language(u"") == None
if __name__ == '__main__': unittest.main()