spec/languages/deutsch_spec.rb
require 'spec_helper'

describe PragmaticTokenizer do
  context 'Language: German (de)' do
    it 'tokenizes a string #001' do
      text = 'Das steht auf S. 23, s. vorherige Anmerkung.'
      expect(PragmaticTokenizer::Tokenizer.new(language: 'de').tokenize(text)).to eq(['das', 'steht', 'auf', 's.', '23', ',', 's.', 'vorherige', 'anmerkung', '.'])
    end

    it 'tokenizes a string #002' do
      text = 'Die größte Ausdehnung des Landes vom Westen nach Osten beträgt 650 km – von Nord nach Süd sind es 560 km. Unter den europäischen Staaten ist Weißrussland flächenmäßig an 13'
      expect(PragmaticTokenizer::Tokenizer.new(
          language:          'de',
          downcase:          false,
          remove_stop_words: true,
          punctuation:       'none',
          numbers:           :none
      ).tokenize(text)).to eq(%w(größte Ausdehnung Landes Westen Osten beträgt Nord Süd europäischen Staaten Weißrussland flächenmäßig))
    end

    it 'tokenizes a string #003' do
      text = 'Die weißrussischen offiziellen Stellen wie auch die deutsche Diplomatie verwenden in offiziellen deutschsprachigen Texten den Namen Belarus, um die Unterscheidung von Russland zu verdeutlichen.'
      expect(PragmaticTokenizer::Tokenizer.new(
          language: 'de',
          downcase: false
      ).tokenize(text)).to eq(["Die", "weißrussischen", "offiziellen", "Stellen", "wie", "auch", "die", "deutsche", "Diplomatie", "verwenden", "in", "offiziellen", "deutschsprachigen", "Texten", "den", "Namen", "Belarus", ",", "um", "die", "Unterscheidung", "von", "Russland", "zu", "verdeutlichen", "."])
    end

    it 'tokenizes a string #004' do
      text = 'der Kaffee-Ersatz'
      expect(PragmaticTokenizer::Tokenizer.new(
          language: 'de',
          downcase: false
      ).tokenize(text)).to eq(['der', 'Kaffee-Ersatz'])
    end

    it 'tokenizes a string #005' do
      text = "Charlie Hebdo backlash over 'racist' Alan Kurdi cartoon - https://t.co/J8N2ylVV3w"
      expect(PragmaticTokenizer::Tokenizer.new(
          language: 'de'
      ).tokenize(text)).to eq(["charlie", "hebdo", "backlash", "over", "'", "racist", "'", "alan", "kurdi", "cartoon", "-", "https://t.co/j8n2ylvv3w"])
    end

    it 'handles words with a slash 1' do
      text = "We pay 3000 €/month"
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(["we", "pay", "3000", "€", "month"])
    end

    it 'handles words with a slash 2' do
      text = "Ich frage mich, wieso er nicht Herr der Lage war/ist."
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(%w(ich frage mich wieso er nicht herr der lage war ist))
    end

    it 'handles words with a slash 3' do
      text = "Poison gas attack in Ghuta/Syria."
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(%w(poison gas attack in ghuta syria))
    end

    it 'handles words with a question mark' do
      text = "Essen á la carte?Man ist versucht…"
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(%w(essen á la carte man ist versucht))
    end

    it 'handles apostrophes and quotes 3' do
      text = "Die “Mitte der Gesellschaft” interessiert sich jetzt für “Feminismus”."
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(%w(die mitte der gesellschaft interessiert sich jetzt für feminismus))
    end

    it 'handles mentions 1' do
      text = "@RainerSteinke @_Sternchen_2015 1:0 für dich."
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(["@rainersteinke", "@_sternchen_2015", "1:0", "für", "dich"])
    end

    it 'handles mentions 2' do
      text = "@LandauDaniel @AnthZeto @julianfranz @S_Beck19 Yep!"
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(["@landaudaniel", "@anthzeto", "@julianfranz", "@s_beck19", "yep"])
    end

    it 'handles old school emoticons 1' do
      text = "du übertreibst maßlos :D"
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          downcase:    false,
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(["du", "übertreibst", "maßlos", ":D"])
    end

    it 'handles words with a symbol suffix' do
      text = "hier ist ein Whirlpool versteckt^^"
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(%w(hier ist ein whirlpool versteckt))
    end

    it 'handles hashtags 1' do
      text = "„Was wir tun wird in diesem Land Leben retten“:#Obama"
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(["was", "wir", "tun", "wird", "in", "diesem", "land", "leben", "retten", "#obama"])
    end

    it 'handles numbers and words' do
      text = "Air Force Once ist 18.270-mal abgehoben."
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(["air", "force", "once", "ist", "18.270-mal", "abgehoben"])
    end

    it 'maintains the german gender-neutrality form 2' do
      text = "der/die Lehrer_in und seine/ihre Schüler_innen"
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(%w(der die lehrer_in und seine ihre schüler_innen))
    end

    it 'handles contractions 1' do
      text = "gibt's"
      pt = PragmaticTokenizer::Tokenizer.new(
          expand_contractions: true,
          language:            'de'
      )
      expect(pt.tokenize(text)).to eq(%w(gibt es))
    end

    it 'handles contractions 2' do
      text = "gibt‘s schaut’s wenn＇s g›spür find´s"
      pt = PragmaticTokenizer::Tokenizer.new(
          expand_contractions: true,
          language:            'de'
      )
      expect(pt.tokenize(text)).to eq(%w(gibt es schaut es wenn es gespür finde es))
    end

    it 'removes English stopwords' do
      text = "der/die Lehrer_in und seine/ihre Schüler_innen. This has some English."
      pt = PragmaticTokenizer::Tokenizer.new(
          filter_languages:  [:en],
          remove_stop_words: true,
          language:          'de'
      )
      expect(pt.tokenize(text)).to eq(["lehrer_in", "schüler_innen", ".", "english", "."])
    end

    it 'removes English and German stopwords' do
      text = "der/die Lehrer_in und seine/ihre Schüler_innen. This has some English."
      pt = PragmaticTokenizer::Tokenizer.new(
          filter_languages:  [:en, :de],
          remove_stop_words: true,
          language:          'de'
      )
      expect(pt.tokenize(text)).to eq(["lehrer_in", "schüler_innen", ".", "english", "."])
    end

    it 'does not remove English stopwords' do
      text = "der/die Lehrer_in und seine/ihre Schüler_innen. This has some English."
      pt = PragmaticTokenizer::Tokenizer.new(
          language: 'de'
      )
      expect(pt.tokenize(text)).to eq(["der", "die", "lehrer_in", "und", "seine", "ihre", "schüler_innen", ".", "this", "has", "some", "english", "."])
    end

    # I don't know how to easily treat these forms, especially the most frequent form
    # that attaches "Innen" (plural) or "In" (singular) (with a capital I) to a word.
    it 'maintains the german gender-neutrality form 1' do
      skip "NOT IMPLEMENTED"
      text = "Wir brauchen eine/n erfahrene/n Informatiker/in."
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(["wir", "brauchen", "eine/n", "erfahrene/n", "informatiker/in"])
    end

    it 'handles apostrophes and quotes 4' do
      skip "NOT IMPLEMENTED"
      text = "Endlich regnet es ihm nicht mehr auf ́s Haupt!"
      pt = PragmaticTokenizer::Tokenizer.new(
          punctuation: 'none',
          language:    'de'
      )
      expect(pt.tokenize(text)).to eq(%w(endlich regnet es ihm nicht mehr auf́s haupt))
    end

    it 'handles abrreviations for languages other than English' do
      text = "Adj. Smith how are ü. today."
      pt = PragmaticTokenizer::Tokenizer.new(
          language: :de
      )
      expect(pt.tokenize(text)).to eq(["adj", ".", "smith", "how", "are", "ü.", "today", "."])
    end
  end
end
