Index: pom.xml
===================================================================
--- pom.xml (revision 1697788)
+++ pom.xml (working copy)
@@ -35,6 +35,12 @@
http://tika.apache.org/
+
+ com.optimaize.languagedetector
+ language-detector
+ 0.5
+
+
org.osgi
Index: src/main/java/org/apache/tika/language/LanguageDetector.java
===================================================================
--- src/main/java/org/apache/tika/language/LanguageDetector.java (revision 0)
+++ src/main/java/org/apache/tika/language/LanguageDetector.java (revision 0)
@@ -0,0 +1,142 @@
+package org.apache.tika.language;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+
+public abstract class LanguageDetector {
+
+ // True if text is expected to be a mix of languages, and thus higher-resolution
+ // detection must be done to avoid under-sampling the text.
+ protected boolean mixedLanguages = false;
+
+ // True if the text is expected to be 'short' (typically less than 100 chars), and
+ // thus a different algorithm and/or set of profiles should be used.
+ protected boolean shortText = false;
+
+ public boolean isMixedLanguages() {
+ return mixedLanguages;
+ }
+
+ public LanguageDetector setMixedLanguages(boolean mixedLanguages) {
+ this.mixedLanguages = mixedLanguages;
+ return this;
+ }
+
+ public boolean isShortText() {
+ return shortText;
+ }
+
+ public LanguageDetector setShortText(boolean shortText) {
+ this.shortText = shortText;
+ return this;
+ }
+
+ /**
+ * Load (or re-load) all available language models. This must
+ * be called after any settings that would impact the models
+ * being loaded (e.g. mixed language/short text), but
+ * before any of the document processing routines (below)
+ * are called. Note that it only needs to be called once.
+ */
+ public abstract void loadModels() throws IOException;
+
+ /**
+ * Load (or re-load) the models specified in . These use the
+ * ISO 639-1 names, with an optional "-" for more
+ * specific specification (e.g. "zh-CN" for Chinese in China).
+ *
+ * @param languages list of target languages.
+ */
+ public abstract void loadModels(Set languages) throws IOException;
+
+ /**
+ * Provide information about whether a model exists for a specific
+ * language.
+ *
+ * @param language ISO 639-1 name for language
+ * @return true if a model for this language exists.
+ */
+ public abstract boolean hasModel(String language);
+
+ // ============================================================
+ // The routines below are called when processing a document
+ // ============================================================
+
+ /**
+ * Reset statistics about the current document being processed
+ */
+ public abstract void reset();
+
+ /**
+ * Add statistics about this text for the current document. Note
+ * that we assume an implicit word break exists before/after
+ * each of these runs of text.
+ *
+ * @param cbuf Character buffer
+ * @param off Offset into cbuf to first character in the run of text
+ * @param len Number of characters in the run of text.
+ */
+ public abstract void addText(char[] cbuf, int off, int len);
+
+ /**
+ * Add to the statistics being accumulated for the current
+ * document. Note that this is a default implementation for adding
+ * a string (not optimized)
+ *
+ * @param text Characters to add to current statistics.
+ */
+ public void addText(CharSequence text) {
+ char[] chars = text.toString().toCharArray();
+ addText(chars, 0, chars.length);
+ }
+
+
+ /**
+ * Tell the caller whether more text is required for the current document
+ * before the language can be reliably detected.
+ *
+ * Implementations can override this to do early termination of stats
+ * collection, which can improve performance with longer documents.
+ *
+ * Note that detect() can be called even when this returns false
+ *
+ * @return true if we have enough text for reliable detection.
+ */
+ public boolean hasEnoughText() {
+ return false;
+ }
+
+ /**
+ * Detect languages based on previously submitted text (via addText calls).
+ *
+ * @return list of all possible languages with at least medium confidence,
+ * sorted by confidence from highest to lowest.
+ */
+ public abstract List detectAll();
+
+ public LanguageResult detect() {
+ List results = detectAll();
+ return results.isEmpty() ? null : results.get(0);
+ }
+
+ /**
+ * Utility wrapper that detects the language of a given chunk of text.
+ *
+ * @param text String to add to current statistics.
+ * @return list of all possible languages with at least medium confidence,
+ * sorted by confidence from highest to lowest.
+ */
+ public List detectAll(String text) {
+ reset();
+ addText(text);
+ return detectAll();
+ }
+
+ public LanguageResult detect(CharSequence text) {
+ reset();
+ addText(text);
+ return detect();
+ }
+
+}
Index: src/main/java/org/apache/tika/language/LanguageHandler.java
===================================================================
--- src/main/java/org/apache/tika/language/LanguageHandler.java (revision 0)
+++ src/main/java/org/apache/tika/language/LanguageHandler.java (revision 0)
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.language;
+
+import org.apache.tika.sax.WriteOutContentHandler;
+
+/**
+ * SAX content handler that updates a language detector based on all the
+ * received character content.
+ *
+ * @since Apache Tika 0.10
+ */
+public class LanguageHandler extends WriteOutContentHandler {
+
+ private final LanguageWriter writer;
+
+ public LanguageHandler(LanguageWriter writer) {
+ super(writer);
+
+ this.writer = writer;
+ }
+
+ public LanguageHandler(LanguageDetector detector) {
+ this(new LanguageWriter(detector));
+ }
+
+ /**
+ * Returns the language detector used by this content handler.
+ * Note that the returned detector gets updated whenever new SAX events
+ * are received by this content handler.
+ *
+ * @return language detector
+ */
+ public LanguageDetector getDetector() {
+ return writer.getDetector();
+ }
+
+}
Index: src/main/java/org/apache/tika/language/LanguageResult.java
===================================================================
--- src/main/java/org/apache/tika/language/LanguageResult.java (revision 0)
+++ src/main/java/org/apache/tika/language/LanguageResult.java (revision 0)
@@ -0,0 +1,45 @@
+package org.apache.tika.language;
+
+public class LanguageResult {
+
+ // Limits for confidence that are used to determine if we're
+ // reasonably certain, or if the result should be used at all.
+ public static final float HIGH_CONFIDENCE = 0.9f;
+
+ // TODO do we need this constant? E.g. implement isUsable or something
+ // with a better name that checks for >= medium confidence limit?
+ public static final float MEDIUM_CONFIDENCE = 0.5f;
+
+ private String language;
+
+ // Confidence must be a number from 0.0 to 1.0, which is normalized such
+ // that it conforms to the range(s) described above.
+ private float confidence;
+
+ /**
+ *
+ * @param language ISO 639-1 language code (plus optional "-")
+ * @param confidence confidence of detector in the result.
+ */
+ public LanguageResult(String language, float confidence) {
+ this.language = language;
+ this.confidence = confidence;
+ }
+
+ public String getLanguage() {
+ return language;
+ }
+
+ public float getConfidence() {
+ return confidence;
+ }
+
+ public boolean isReasonablyCertain() {
+ return confidence >= HIGH_CONFIDENCE;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s: %f", language, confidence);
+ }
+}
Index: src/main/java/org/apache/tika/language/LanguageWriter.java
===================================================================
--- src/main/java/org/apache/tika/language/LanguageWriter.java (revision 0)
+++ src/main/java/org/apache/tika/language/LanguageWriter.java (revision 0)
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.language;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Writer that builds a language profile based on all the written content.
+ *
+ * @since Apache Tika 0.10
+ */
+public class LanguageWriter extends Writer {
+
+ private final LanguageDetector detector;
+
+ public LanguageWriter(LanguageDetector detector) {
+ this.detector = detector;
+ detector.reset();
+ }
+
+ /**
+ * Returns the language detector used by this writer. Note that
+ * the returned language detector gets updated whenever new characters
+ * are written.
+ *
+ * @return language detector
+ */
+ public LanguageDetector getDetector() {
+ return detector;
+ }
+
+ @Override
+ public void write(char[] cbuf, int off, int len) {
+ detector.addText(cbuf, off, len);
+ }
+
+ @Override
+ public void close() throws IOException {
+ // TODO do we need to do anything here?
+ }
+
+ /**
+ * Ignored.
+ */
+ @Override
+ public void flush() {
+ }
+
+}
Index: src/main/java/org/apache/tika/language/langdetector/LangDetector.java
===================================================================
--- src/main/java/org/apache/tika/language/langdetector/LangDetector.java (revision 0)
+++ src/main/java/org/apache/tika/language/langdetector/LangDetector.java (revision 0)
@@ -0,0 +1,111 @@
+package org.apache.tika.language.langdetector;
+
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.tika.language.LanguageDetector;
+import org.apache.tika.language.LanguageResult;
+
+import com.optimaize.langdetect.DetectedLanguage;
+import com.optimaize.langdetect.LanguageDetectorBuilder;
+import com.optimaize.langdetect.i18n.LdLocale;
+import com.optimaize.langdetect.ngram.NgramExtractors;
+import com.optimaize.langdetect.profiles.LanguageProfile;
+import com.optimaize.langdetect.profiles.LanguageProfileReader;
+
+/**
+ * Implementation of the LanguageDetector API that uses
+ * https://github.com/optimaize/language-detector
+ *
+ */
+public class LangDetector extends LanguageDetector {
+
+ private com.optimaize.langdetect.LanguageDetector detector;
+ private CharArrayWriter writer;
+ private Set languages;
+
+ public LangDetector() {
+ super();
+
+ writer = new CharArrayWriter(1000);
+ }
+
+ @Override
+ public void loadModels() throws IOException {
+ List languageProfiles = new LanguageProfileReader().readAllBuiltIn();
+
+ // FUTURE when the "language-detector" project supports short profiles, check if
+ // isShortText() returns true and switch to those.
+
+ languages = new HashSet<>();
+ for (LanguageProfile profile : languageProfiles) {
+ // TODO we might have to strip out the script portion of what
+ // LdLocale returns in toString.
+ languages.add(profile.getLocale().toString());
+ }
+
+ detector = LanguageDetectorBuilder.create(NgramExtractors.standard())
+ .shortTextAlgorithm(mixedLanguages ? Integer.MAX_VALUE : 100)
+ .withProfiles(languageProfiles)
+ .build();
+
+ }
+
+ @Override
+ public void loadModels(Set languages) throws IOException {
+ this.languages = languages;
+
+ Set locales = new HashSet<>();
+ for (String language : languages) {
+ // TODO do we need to worry about a profile that has a script component, e.g. de-Latn-CH?
+ locales.add(LdLocale.fromString(language));
+ }
+
+ List languageProfiles = new LanguageProfileReader().readBuiltIn(locales);
+ detector = LanguageDetectorBuilder.create(NgramExtractors.standard())
+ .withProfiles(languageProfiles)
+ .build();
+ }
+
+ @Override
+ public boolean hasModel(String language) {
+ return languages.contains(language);
+ }
+
+ @Override
+ public void reset() {
+ writer.reset();
+ }
+
+ @Override
+ public void addText(char[] cbuf, int off, int len) {
+ writer.write(cbuf, off, len);
+
+ // FUTURE - use support to get padding char from NGramExtractors.standard().
+ // We'd like to get the textPadding character from the NGramExtractor, but
+ // that's not exposed. NGramExtractors.standard() returns extractor with ' '
+ // as padding, so that's what we'll use here.
+ writer.write(' ');
+ }
+
+ @Override
+ public List detectAll() {
+ // TODO throw exception if models haven't been loaded, or auto-load all?
+
+ List result = new ArrayList<>();
+
+ List rawResults = detector.getProbabilities(writer.toString());
+ for (DetectedLanguage rawResult : rawResults) {
+ // TODO do we need to worry about mapping from the locale, if it has a script component?
+ // TODO munge probabilities to match the ranges defined in LanguageResult, for confidence levels
+ result.add(new LanguageResult(rawResult.getLocale().toString(), (float)rawResult.getProbability()));
+ }
+
+ return result;
+ }
+
+}
Index: src/test/java/org/apache/tika/language/langdetector/LangDetectorTest.java
===================================================================
--- src/test/java/org/apache/tika/language/langdetector/LangDetectorTest.java (revision 0)
+++ src/test/java/org/apache/tika/language/langdetector/LangDetectorTest.java (revision 0)
@@ -0,0 +1,156 @@
+package org.apache.tika.language.langdetector;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Writer;
+import java.util.List;
+
+import org.apache.tika.io.IOUtils;
+import org.apache.tika.language.LanguageDetector;
+import org.apache.tika.language.LanguageIdentifierTest;
+import org.apache.tika.language.LanguageResult;
+import org.apache.tika.language.LanguageWriter;
+import org.junit.Test;
+
+public class LangDetectorTest {
+
+ // TODO add test text for other languages supported by "language-detector", and then
+ // add to this list. The complete list (ones we have tests for have '*' after) is:
+ /*
+ af Afrikaans
+ an Aragonese
+ ar Arabic
+ ast Asturian
+ be Belarusian
+ br Breton
+ ca Catalan
+ bg Bulgarian
+ bn Bengali
+ cs Czech
+ cy Welsh
+ da Danish *
+ de German *
+ el Greek *
+ en English *
+ es Spanish *
+ et Estonian
+ eu Basque
+ fa Persian
+ fi Finnish *
+ fr French *
+ ga Irish
+ gl Galician
+ gu Gujarati
+ he Hebrew
+ hi Hindi
+ hr Croatian
+ ht Haitian
+ hu Hungarian
+ id Indonesian
+ is Icelandic
+ it Italian *
+ ja Japanese *
+ km Khmer
+ kn Kannada
+ ko Korean
+ lt Lithuanian *
+ lv Latvian
+ mk Macedonian
+ ml Malayalam
+ mr Marathi
+ ms Malay
+ mt Maltese
+ ne Nepali
+ nl Dutch *
+ no Norwegian
+ oc Occitan
+ pa Punjabi
+ pl Polish
+ pt Portuguese *
+ ro Romanian
+ ru Russian
+ sk Slovak
+ sl Slovene
+ so Somali
+ sq Albanian
+ sr Serbian
+ sv Swedish *
+ sw Swahili
+ ta Tamil
+ te Telugu
+ th Thai *
+ tl Tagalog
+ tr Turkish
+ uk Ukrainian
+ ur Urdu
+ vi Vietnamese
+ yi Yiddish
+ zh-cn Simplified Chinese
+ zh-tw Traditional Chinese
+ */
+
+ private static final String[] LANGUAGES = new String[] {
+ "da", "de", "et", "el", "en", "es", "fi", "fr", "it",
+ "ja", "lt", "nl", "pt", "sv", "th"
+ };
+
+ @Test
+ public void testLanguageDetection() throws IOException {
+ LangDetector detector = new LangDetector();
+ detector.loadModels();
+
+ for (String language : LANGUAGES) {
+ LanguageWriter writer = new LanguageWriter(detector);
+ writeTo(language, writer);
+
+ LanguageResult result = detector.detect();
+ assertFalse(result == null);
+
+ assertEquals(language, result.getLanguage());
+ assertTrue(result.isReasonablyCertain());
+ }
+ }
+
+ @Test
+ public void testMixedLanguages() throws IOException {
+ LanguageDetector detector = new LangDetector()
+ .setMixedLanguages(true);
+
+ detector.loadModels();
+
+ for (int i = 0; i < LANGUAGES.length; i++) {
+ String language = LANGUAGES[i];
+ for (int j = i + 1; j < LANGUAGES.length; j++) {
+ String other = LANGUAGES[j];
+
+ LanguageWriter writer = new LanguageWriter(detector);
+ writeTo(language, writer);
+ writeTo(other, writer);
+
+ List results = detector.detectAll();
+ if (results.size() > 0) {
+ LanguageResult result = results.get(0);
+
+ assertFalse("mix of " + language + " and " + other + " incorrectly detected as " + result, result.isReasonablyCertain());
+ }
+ }
+ }
+ }
+
+ private void writeTo(String language, Writer writer) throws IOException {
+ InputStream stream =
+ LanguageIdentifierTest.class.getResourceAsStream(language + ".test");
+ try {
+ IOUtils.copy(new InputStreamReader(stream, UTF_8), writer);
+ } finally {
+ stream.close();
+ }
+ }
+
+}
Index: src/test/resources/org/apache/tika/language/ja.test
===================================================================
--- src/test/resources/org/apache/tika/language/ja.test (revision 0)
+++ src/test/resources/org/apache/tika/language/ja.test (revision 0)
@@ -0,0 +1,78 @@
+フィンセント・ファン・ゴッホ[注釈 1](Vincent Willem van Gogh、1853年3月30日 - 1890年7月29日)は、オランダ出身でポスト印象派(後期印象派)の画家。主要作品の多くは1886年以降のフランス居住時代、特にアルル時代(1888年 - 1889年5月)とサン=レミの精神病院での療養時代(1889年5月 - 1890年5月)に制作された。
+
+彼の作品は感情の率直な表現、大胆な色使いで知られ、ポスト印象派の代表的画家である。フォーヴィスムやドイツ表現主義など、20世紀の美術にも大きな影響を及ぼした。
+
+概要
+グーピル商会の画廊で働いていた19歳頃の写真[1]。
+1878年(当時21歳)のテオ。兄フィンセントの支援者・理解者であった。
+
+ゴッホは、1853年、オランダ南部のズンデルトで牧師の家に生まれた(→出生、少年時代)。1869年、画商グーピル商会に勤め始め、ハーグ、ロンドン、パリで働くが、1876年、商会を解雇された(→グーピル商会)。その後イギリスで教師として働いたりオランダのドルトレヒトの書店で働いたりするうちに聖職者を志すようになり、1877年、アムステルダムで神学部の受験勉強を始めるが挫折した。1878年末以降、ベルギーの炭坑地帯ボリナージュ地方で伝道活動を行ううち、画家を目指すことを決意した(→聖職者への志望)。以降、オランダのエッテン(1881年4月-12月)、ハーグ(1882年1月-1883年9月)、ニューネン(1883年12月-1885年11月)、ベルギーのアントウェルペン(1885年11月-1886年2月)と移り、弟テオドルス(通称テオ)の援助を受けながら画作を続けた。オランダ時代には、貧しい農民の生活を描いた暗い色調の絵が多く、ニューネンで制作した「ジャガイモを食べる人々」はこの時代の主要作品である。
+
+1886年2月、テオを頼ってパリに移り、印象派や新印象派の影響を受けた明るい色調の絵を描くようになった。この時期の作品としては「タンギー爺さん」などが知られる。日本の浮世絵にも関心を持ち、収集や模写を行っている(→パリ時代)。1888年2月、南フランスのアルルに移り、「ひまわり」や「夜のカフェテラス」などの名作を次々に生み出した。南フランスに画家の協同組合を築くことを夢見て、同年10月末からポール・ゴーギャンを迎えての共同生活が始まったが、次第に2人の関係は行き詰まり、12月末のゴッホの「耳切り事件」で共同生活は終焉した。以後、発作に苦しみながらアルルの病院への入退院を繰り返した(→アルル時代)。1889年5月からはアルル近郊のサン=レミの精神病院に入院した。発作の合間にも「星月夜」など多くの風景画、人物画を描き続けた(→サン=レミ時代)。1890年5月、精神病院を退院してパリ近郊のオーヴェル=シュル=オワーズに移り画作を続けたが(→オーヴェル時代)、7月27日、自ら銃を撃ち、29日死亡した。もっとも、自殺という一般の理解に対しては異説もある(→死)。発作等の原因については、癲癇、統合失調症など様々な仮説が研究者によって発表されている(→病因)。
+
+生前に売れた絵はたった1枚「赤い葡萄畑」だったと言われているが、晩年には彼を高く評価する評論が現れていた。彼の死後、回顧展の開催、書簡集や伝記の出版などを通じて急速に知名度が上がるにつれ、市場での作品の評価も急騰した。彼の生涯は多くの伝記や『炎の人ゴッホ』に代表される小説・映画などで描かれ、「情熱的な画家」、「狂気の天才」といった幻想的イメージをもって語られるようになった(→後世)。
+
+弟テオや友人らと交わした多くの手紙が、書簡集として出版されており、彼の生活や考え方を知ることができる(→手紙)。約10年の間に、油絵約860点、水彩画約150点、素描約1030点、版画約10点を残し、手紙に描き込んだスケッチ約130点も合わせると、2100以上の絵を残した[2]。有名な作品の多くは最後の2年間(アルル時代以降)に制作された油絵である。一連の「自画像」のほか身近な人々の肖像画、花の静物画、風景画などが多く、特に「ひまわり」や小麦畑、糸杉などをモチーフとしたものがよく知られている。印象派の美学の影響を受けながらも、大胆な色彩やタッチによって自己の内面や情念を表現した彼の作品は、外界の光の効果を画面上に捉えることを追求した印象派とは一線を画するものであり、ゴーギャンやセザンヌと並んでポスト印象派を代表する画家である。またその芸術は表現主義の先駆けでもあった(→作品)。
+
+生涯
+出生、少年時代(1853年-1869年)
+フィンセント・ファン・ゴッホは、1853年3月30日、オランダ南部の北ブラバント州ブレダにほど近いズンデルト[注釈 2]の村で、父テオドルス・ファン・ゴッホ(通称ドルス、1822年-1885年)と母アンナ・コルネリア・カルベントゥス(1819年-1907年)との間の長男として生まれた。父ドルスは、オランダ改革派の牧師であり、1849年にこの村の牧師館に赴任し、1851年、アンナと結婚した[3]。ブラバントは、オランダ北部とは異なりカトリックの人口が多く、ドルス牧師の指導する新教徒は村の少数派であった[4][注釈 3]。
+
+フィンセントという名は、ドルス牧師の父でブレダの高名な牧師であったフィンセント・ファン・ゴッホ(1789年-1874年)からとられている[5]。祖父フィンセントには、長男ヘンドリク(ヘイン伯父)、次女ドロアテ、次男ヨハンネス(ヤン伯父)、三男ヴィレム、四男フィンセント(セント伯父)、五男テオドルス(父ドルス牧師)、三女エリーザベト、六男コルネリス・マリヌス(コル叔父)、四女マリアという子があり、このうちヘイン伯父、セント伯父、コル叔父は画商になっている[6]。
+1866年頃(13歳頃)のフィンセント。
+「農場の家と納屋」1864年2月、素描。
+
+父ドルス牧師と母アンナとの間には、画家フィンセントが生まれるちょうど1年前の1852年3月30日に、死産の子があり、その兄にもフィンセントという名が付けられていた[7][注釈 4]。画家フィンセントの後に、妹アンナ(1855年生)、弟テオドルス(通称テオ、1857年生)、妹エリーザベト(1859年生)、妹ヴィレミーナ(通称ヴィル、1862年生)、弟コルネリス(通称コル、1867年生)が生まれた[8]。
+
+フィンセントは、小さい時から癇癪持ちで、両親や家政婦からは兄弟の中でもとりわけ扱いにくい子と見られていた。親に無断で一人で遠出することも多く、ヒースの広がる低湿地を歩き回り、花や昆虫や鳥を観察して1日を過ごしていた[9]。1860年からズンデルト村の学校に通っていたが、1861年から1864年まで、妹アンナとともに家庭教師の指導を受けた[8]。1864年2月に11歳のフィンセントが父の誕生日のために描いたと思われる「農場の家と納屋」と題する素描が残っており、絵の才能の可能性を示している[10]。1864年10月からは約20km離れたゼーフェンベルゲンのヤン・プロフィリ寄宿学校に入った[8]。彼は、後に、親元を離れて入学した時のことを「僕がプロフィリさんの学校の石段の上に立って、お父さんとお母さんを乗せた馬車が家の方へ帰っていくのを見送っていたのは、秋の日のことだった。」と回顧している[11][手紙 1]。
+
+1866年9月15日、ティルブルフに新しくできた国立高等市民学校、ウィレム2世校に進学した。パリで成功したコンスタント=コルネーリス・ハイスマンスという画家がこの学校で教えており、ゴッホも彼から絵を習ったと思われる[12]。1868年3月、ゴッホはあと1年を残して学校をやめ、家に帰ってしまった。その理由は分かっていない[13]。本人は、1883年テオに宛てた手紙の中で、「僕の若い時代は、陰鬱で冷たく不毛だった」と書いている[手紙 2]。
+グーピル商会(1869年-1876年)
+
+1869年7月、セント伯父の助力で、ゴッホは画商グーピル商会のハーグ支店の店員となり、ここで約4年間過ごした[注釈 5]。彼は、この時のことについて「2年間は割と面白くなかったが、最後の年はとても楽しかった」と書いている[14][手紙 3]。テオの妻ヨーによれば、この時上司のテルステーフはフィンセントの両親に、彼は勤勉で誰にも好かれるという高評価を書き送ったというが[15]、実際にはテルステーフやハーグ支店の経営者であるセント伯父との関係はうまく行っていなかったと見られる[16]。1872年夏、当時まだ学生だった弟テオがハーグのフィンセントのもとを訪れ、職場でも両親との間でも孤立感を深めていたフィンセントはテオに親しみを見出した。この時レイスウェイクまで2人で散歩し、にわか雨に遭って風車小屋でミルクを飲んだことを、フィンセントは後に鮮やかな思い出として回想している。この直後にフィンセントはテオに手紙を書き、以後2人の間で書簡のやり取りが始まった[17]。
+ゴッホが1869年(16歳)から1873年(20歳)まで勤めたグーピル商会ハーグ支店。
+
+フィンセントは、ハーグ支店時代に、近くのマウリッツハイス美術館でレンブラントやフェルメールらオランダ黄金時代の絵画に触れるなど、美術に興味を持つようになった。また、グーピル商会で1870年代初頭から扱われるようになった新興のハーグ派の絵にも触れる機会があった[18]。
+
+1873年5月、彼はロンドン支店に転勤となった[19]。表向きは栄転であったが、実際にはテルステーフやセント伯父との関係悪化、フィンセントの娼館通いなどの不品行が理由でハーグを追い出されたものとも見られている[20]。8月末からロワイエ家の下宿に移った[21]。ヨーの回想録によれば、ゴッホは下宿先の娘ユルシュラ・ロワイエに恋をし、思いを告白したが、彼女は実は以前下宿していた男と婚約していると言って断られたという。そして、その後彼はますます孤独になり、宗教的情熱を強めることになったという[22]。しかし、この物語には最近の研究で疑問が投げかけられており、ユルシュラは下宿先の娘ではなくその母親の名前であることが分かっている[注釈 6]。そして、ゴッホ自身が書いている「20歳の恋」[注釈 7]の相手は、ハーグで親交のあった遠い親戚のカロリーナ・ファン・ストックム=ハーネベーク(カロリーン)ではないかという説がある[23]。いずれにしても、彼は、ロワイエ家の下宿を出た後、1874年冬頃から、チャールズ・スポルジョンの説教を聞きに行ったり、ジュール・ミシュレ、イポリット・テーヌの著作、またエルネスト・ルナンの『イエス伝』などを読み進めたりするうちに、キリスト教への関心を急速に深めていった[24]。
+
+1875年5月、彼はパリ本店に転勤となった[25][注釈 8]。同じパリ本店の見習いで同宿だったハリー・グラッドウェルとともに、聖書やトマス・ア・ケンピスの『キリストに倣いて』に読みふけった[26]。他方、金儲けだけを追求するようなグーピル商会の仕事には反感を募らせた[27]。この頃、父はフィンセントには今の職場が合わないようだとテオに書いている[28]。翌1876年1月、彼はグーピル商会から4月1日をもって解雇するとの通告を受けた[29][手紙 4][注釈 9]。この事件は両親に衝撃と失望を与えた[30]。
+聖職者への志望(1876年-1880年)
+「エッテンの牧師館と教会」1876年4月、エッテン。グーピル商会を解雇された23歳のゴッホは、イギリスに発つ前、ブレダ西郊の農村エッテンの実家に立ち寄り、家族に別れを告げた[31][注釈 10]。
+
+同年(1876年)4月、ゴッホはイギリスに戻り、ラムズゲートの港を見下ろす、ストークス氏の経営する小さな寄宿学校で無給で教師として働くこととなった。ここで少年たちにフランス語初歩、算術、書き取りなどを教えた。同年6月、寄宿学校はロンドン郊外のアイズルワースに移ることとなり、フィンセントはアイズルワースまで徒歩で旅した。しかし、伝道師になって労働者や貧しい人の間で働きたいという希望を持っていたフィンセントは、ストークス氏の寄宿学校での仕事を続けることなく、組合教会のジョーンズ牧師の下で、少年たちに聖書を教えたり、貧民街で牧師の手伝いをしたりした[32]。ジョージ・エリオットの『牧師館物語』や『アダム・ビード』を読んだことも、伝道師になりたいという希望に火を付けた[33]。
+
+その年のクリスマス、彼はエッテンの父の家に帰省した。聖職者になるには7年から8年もの勉強が必要であり、無理だという父ドルス牧師の説得を受け[34]、翌1877年1月から5月初旬まで、南ホラント州ドルトレヒトの書店ブリュッセ&ファン・ブラームで働いた。しかし、言われた仕事は果たすものの、暇を見つけては聖書の章句を英語やフランス語やドイツ語に翻訳していたという。また、この時の下宿仲間で教師だったヘルリッツは、フィンセントは食卓で長い間祈り、肉は口にせず、日曜日にはオランダ改革派教会だけでなくヤンセン派教会、カトリック教会、ルター派教会に行っていたと語っている[35]。
+
+フィンセントは、ますます聖職者になりたいという希望を募らせ、受験勉強に耐えることを約束して父を説得した[36]。同年3月、アムステルダムのコル叔父や、母の姉の夫ヨハネス・ストリッケル牧師を訪ねて、相談した。コル叔父の仲介で、アムステルダム海軍造船所長官のヤン伯父が、ゴッホの神学部受験のため、彼を迎え入れてくれることになった。そして、同年5月、ゴッホはエッテンからアムステルダムに向かい、ヤン伯父の家に下宿し、ストリッケル牧師と相談しながら、王立大学での神学教育を目指して勉学に励むことになった[37]。ストリッケル牧師の世話で、2歳年上のメンデス・ダ・コスタからギリシャ語とラテン語を習った。しかし、その複雑な文法や、代数、幾何、歴史、地理、オランダ語文法など受験科目の多さに挫折を味わった[38]。精神的に追い詰められたゴッホは、パンしか口にしない、わざと屋外で夜を明かす、杖で自分の背中を打つというような自罰的行動に走った[39]。1878年2月、習熟度のチェックのために訪れた父からは、勉強が進んでいないことを厳しく指摘され、学資も自分で稼ぐように言い渡された[40]。フィンセントはますます勉強から遠ざかり、アムステルダムでユダヤ人にキリスト教を布教しようとしているチャールズ・アドラー牧師らと交わるうちに、貧しい人々に聖書を説く伝道師になりたいという思いを固めた[41]。
+
+こうして、同年(1878年)10月の試験の日を待たずに、同年7月、ヤン伯父の家を出てエッテンに戻り、今度は同年8月からベルギーのブリュッセル北郊ラーケンの伝道師養成学校で3か月間の試行期間を過ごした。同年11月15日に試行期間が終わる時、学校から、フランドル生まれの生徒と同じ条件での在学はできない、ただし無料で授業を受けてもよい、という提案を受けた。しかし、彼は、引き続き勉強するためには資金が必要だから、自分は伝道のためボリナージュに行くことにするとテオに書いている[42][手紙 5]。
+
+同年(1878年)12月、彼はベルギーの炭鉱地帯、ボリナージュ地方(モンス近郊)に赴き、プティ=ヴァムの村で、パン屋ジャン=バティスト・ドゥニの家に下宿しながら伝道活動を始めた。1879年1月から、熱意を認められて半年の間は伝道師としての仮免許と月額50フランの俸給が与えられることになった。彼は貧しい人々に説教を行い、病人・けが人に献身的に尽くすとともに、自分自身も貧しい坑夫らの生活に合わせて同じような生活を送るようになり、着るものもみすぼらしくなった[43]。しかし、苛酷な労働条件や賃金の大幅カットに労働者が死に、抑圧され、労働争議が巻き起こる炭鉱の町において、社会的不正義に憤るというよりも、『キリストに倣いて』が教えるように、苦しみの中に神の癒しを見出すことを説いたオランダ人伝道師は、人々の理解を得られなかった[44]。教会の伝道委員会も、ゴッホの常軌を逸した自罰的行動を伝道師の威厳を損なうものとして否定し、ゴッホがその警告に従うことを拒絶すると、伝道師の仮免許と俸給は打ち切られた[45]。
+1880年、ゴッホ(当時27歳)がクウェムで暮らした家。ここにいる時に彼は画家となることを決めた。
+
+伝道師としての道を絶たれたゴッホは、同年(1879年)8月、同じくボリナージュ地方のクウェム(モンス南西の郊外)の伝道師フランクと坑夫シャルル・ドゥクリュクの家に移り住んだ[46]。父親からの仕送りに頼ってデッサンの模写や坑夫のスケッチをして過ごしたが、家族からは仕事をしていないフィンセントに厳しい目が注がれ、彼のもとを訪れた弟テオからも「年金生活者」のような生活ぶりについて批判された[47]。1880年3月頃、絶望のうちに北フランスへ放浪の旅に出て、金も食べるものも泊まるところもなく、ひたすら歩いて回った[48]。そしてついにエッテンの実家に帰ったが、彼の常軌を逸した傾向を憂慮した父親がヘールの精神病院に入れようとしたことで口論になり、クウェムに戻った[49]。
+
+クウェムに戻った1880年6月頃から、テオからフィンセントへの生活費の援助が始まった[50][手紙 6]。また、この時期、周りの人々や風景をスケッチしているうちに、ゴッホは本格的に絵を描くことを決意したようである[51]。9月には、北フランスへの苦しい放浪を振り返って、「しかしまさにこの貧窮の中で、僕は力が戻ってくるのを感じ、ここから立ち直るのだ、くじけて置いていた鉛筆をとり直し、絵に戻るのだと自分に言い聞かせた。」と書いている[手紙 7]。ジャン=フランソワ・ミレーの複製を手本に素描を練習したり、シャルル・バルグのデッサン教本を模写したりした[52]。
+
+同年(1880年)10月、絵を勉強しようとして突然ブリュッセルに出て行った。そして、運搬夫、労働者、少年、兵隊などをモデルにデッサンを続けた。また、この時、ブリュッセル王立美術アカデミーに在籍していた画家アントン・ファン・ラッパルトと交友を持つようになった[53]。ゴッホ自身も、ハーグ派の画家ウィレム・ルーロフスから、本格的に画家を目指すのであればアカデミーに進むよう勧められた[54]。同年11月第1週から、同アカデミーの「アンティーク作品からの素描」というコースに登録した記録が残っており、実際に短期間出席したものと見られている[55]。また、名前は不明だが、ある画家から短期間、遠近法や解剖学のレッスンを受けていた[56]。
+オランダ時代
+エッテン(1881年)
+「父テオドルス」1881年、エッテン。鉛筆。
+ゴッホ(当時27歳)の片思いの相手ケー・フォス・ストリッケルと、その息子ヤン。
+
+1881年4月、ゴッホはブリュッセルに住むことによる経済的な問題が大きかったため、エッテンの実家に戻り、田園風景や近くの農夫たちを素材に素描や水彩画を描き続けた。まだぎこちなさが残るが、この頃にはゴッホ特有の太く黒い描線と力強さが現れ始めていた[57]。夏の間、最近夫を亡くしたいとこのケー・フォス・ストリッケル(母の姉と、アムステルダムのヨハネス・ストリッケル牧師との間の娘)がエッテンを訪れた。彼はケーと連れ立って散歩したりするうちに、彼女に好意を持つようになった。未亡人のケーはゴッホより7歳上で、さらに8歳の子供もいたにもかかわらずゴッホは求婚するが、「とんでもない、だめ、絶対に。」という言葉で拒絶され、打ちのめされた[58][手紙 8]。
+
+ケーはアムステルダムに帰ってしまったが、ゴッホは彼女への思いを諦めきれず、ケーに何度も手紙を書き、11月末には、テオに無心した金でアムステルダムのストリッケル牧師の家を訪ねた。しかし、ケーからは会うことを拒否され、両親のストリッケル夫妻からはしつこい行動が不愉快だと非難された。絶望した彼は、ストリッケル夫妻の前でランプの炎に手をかざし、「私が炎に手を置いていられる間、彼女に会わせてください。」と迫ったが、夫妻は、ランプを吹き消して、会うことはできないと言うのみだった[59][手紙 9]。伯父ストリッケル牧師の頑迷な態度は、ゴッホに聖職者たちへの疑念を呼び起こし、父やストリッケル牧師の世代との溝を強く意識させることになった[60]。
+
+11月27日、ハーグに向かい、義理の従兄弟で画家のアントン・モーヴから絵の指導を受けたが、クリスマス前にいったんエッテンの実家に帰省する。しかし、クリスマスの日に彼は教会に行くことを拒み、それが原因で父親と激しく口論し、その日のうちに実家を離れて再びハーグへ発ってしまった[61][手紙 10]。
+ハーグ(1882年-1883年)
+「屋根、ハーグのアトリエからの眺め」1882年、ハーグ。水彩。個人コレクション。ゴッホは28歳から30歳にかけてハーグに住んだ。
+シーンを描いた「悲しみ」1882年4月、ハーグ。素描(黒チョーク)。
+
+1882年1月、彼はハーグに住み始め、オランダ写実主義・ハーグ派の担い手であったモーヴを頼った。モーヴはゴッホに油絵と水彩画の指導をするとともに、アトリエを借りるための資金を貸し出すなど、親身になって面倒を見てくれた[62]。ハーグの絵画協会プルクリ・スタジオの準会員にも推薦してくれた[63]。しかし、モーヴは次第にゴッホによそよそしい態度を取り始め、ゴッホが手紙を書いても返事を寄越さなくなった。ゴッホはこの頃にクラシーナ・マリア・ホールニク(通称シーン)という身重の娼婦をモデルとして使いながら、彼女の家賃を払ってやるなどの援助をしており、結婚さえ考えていたが、彼は、モーヴの態度が冷たくなったのはこの交際のためだと考えている[64][手紙 11]。石膏像のスケッチから始めるよう助言するモーヴと、モデルを使っての人物画に固執するゴッホとの意見の不一致も原因のようである[65]。ゴッホは、わずかな意見の違いも自分に対する全否定であるかのように受け止めて怒りを爆発させる性向があり、モーヴに限らず、知り合ったハーグ派の画家たちも次々彼を避けるようになっていった[66]。交友関係に失敗した彼の関心は、アトリエでモデルに思いどおりのポーズをとらせ、ひたすらスケッチをすることに集中したが、月100フランのテオからの仕送りの大部分をモデル料に費やし、少しでも送金が遅れると自分の芸術を損なうものだと言ってテオをなじった[67][注釈 11]。
+1882年夏頃、遠近法やプロポーションを捉えるための透視枠を自作し、1888年5月のアルル初期まで使っていた[68][手紙 12]。
+
+同年(1882年)3月、ゴッホのもとを訪れたコル叔父が、街の風景の素描を12点注文してくれたため、ゴッホはハーグ市街を描き続けた[69]。そしてコル叔父に素描を送ったが、コル叔父は「こんなのは商品価値がない」と言って、ゴッホが期待したほどの代金は送ってくれなかった[70]。ゴッホは、同年6月、淋病で3週間入院し、退院直後の7月始め、ゴッホは今までの家の隣の家に引っ越し、この新居に、長男ウィレムを出産したばかりのシーンとその5歳の娘と暮らし始めた[71]。一時は、売れる見込みのある油絵の風景画を描くようにとのテオの忠告にしぶしぶ従い、スヘフェニンゲンの海岸などを描いたが、間もなく、上達が遅いことを自ら認め、挫折した[72]。冬の間は、アトリエで、シーンの母親や、赤ん坊、身寄りのない老人などを素描した[73]。
+
+ゴッホはそこで1年余りシーンと共同生活をしていたが、1883年5月には、「シーンはかんしゃくを起こし、意地悪くなり、とても耐え難い状態だ。以前の悪習へ逆戻りしそうで、こちらも絶望的になる。」などとテオに書いている[74][手紙 13]。ゴッホは、オランダ北部のドレンテ州に出て油絵の修行をすることを考え、同年9月初め、シーンとの間で、ハーグでこのまま暮らすことは経済的に不可能であるため、彼女は子どもたちを自分の家族に引き取ってもらうこと、彼女は自分の仕事を探すことなどを話し合った。シーンと別れたことを父に知らせ、ゴッホは、9月11日、ドレンテ州のホーヘフェーンへ発った[75][手紙 14][注釈 12]。また、同年10月からはドレンテ州ニーウ・アムステルダムの泥炭地帯を旅しながら、ミレーのように農民の生活を描くべきだと感じ、馬で畑を犂く人々を素描した[76]。
Index: src/test/resources/org/apache/tika/language/th.test
===================================================================
--- src/test/resources/org/apache/tika/language/th.test (revision 0)
+++ src/test/resources/org/apache/tika/language/th.test (revision 0)
@@ -0,0 +1,28 @@
+สงครามอังกฤษ–แซนซิบาร์
+จากวิกิพีเดีย สารานุกรมเสรี
+สงครามอังกฤษ-แซนซิบาร์ (อังกฤษ: Anglo-Zanzibar War) เป็นการสู้รบระหว่างสหราชอาณาจักรและรัฐสุลต่านแซนซิบาร์ในวันที่ 27 สิงหาคม ค.ศ. 1896 ความขัดแย้งนี้กินเวลาเพียง 38 นาที[nb 1] นับเป็นสงครามที่สั้นที่สุดในประวัติศาสตร์[7] สาเหตุที่ใกล้ชิดของสงครามนี้เกิดจากฮาเม็ด บิน ทูเวไน (Hamad bin Thuwaini) สุลต่านที่ได้รับความเห็นชอบจากสหราชอาณาจักร สวรรคตในวันที่ 25 สิงหาคม ค.ศ. 1896 และคาลิด บิน บาร์กาช (Khalid bin Barghash) สืบราชสันตติวงศ์ ขณะที่สหราชอาณาจักรเห็นชอบให้ฮามัด บิน มุฮามเม็ด (Hamud bin Muhammed) ผู้ที่จะอำนวยประโยชน์ให้แก่สหราชอาณาจักรได้มากกว่า เป็นสุลต่าน ตามสนธิสัญญาที่ลงนามใน ค.ศ. 1886 เงื่อนไขการขึ้นครองราชย์ คือ ผู้มีคุณสมบัติต้องได้รับการอนุญาตจากกงสุลสหราชอาณาจักรเสียก่อน แต่คาลิดนั้นมิได้เป็นไปตามข้อกำหนดนี้ สหราชอาณาจักรถือว่าเป็นเหตุแห่งสงคราม และยื่นคำขาดต่อคาลิดให้พระองค์มีพระบรมราชโองการให้กองกำลังของพระองค์วางอาวุธ และให้ออกจากพระราชวัง สุลต่านคาลิดโต้ตอบโดยทรงระดมยามพระราชวังและทรงขังพระองค์อยู่ในพระราชวัง
+
+เส้นตายสิ้นสุดที่เวลา 09:00 น. ตามเวลาแอฟริกาตะวันออก (EAT) ของวันที่ 27 สิงหาคม ณ เวลานั้นกองกำลังของอังกฤษประกอบด้วยเรือลาดตระเวน 3 ลำ เรือปืน 2 ลำ นาวิกโยธินและลูกเรือ 150 นาย และชาวแซนซิบาร์ 900 คนได้ชุมนุมกันที่บริเวณท่าเรือ กองทัพเรือสหราชอาณาจักรอยู่ภายใต้บังคับบัญชาของพลเรือตรีแฮร์รี รอว์ซัน (Harry Rawson) ขณะที่ชาวแซนซิบาร์อยู่ภายใต้การบังคับบัญชาของพลจัตวาลอยด์ แมตทิวส์ (Lloyd Mathews) แห่งกองทัพบกแซนซิบาร์ กองกำลังป้องกันพระราชวังฝ่ายแซนซิบาร์มีประมาณ 2,800 คน กองกำลังส่วนมากเกณฑ์มาจากประชาชนทั่วไป มียามพระราชวังปะปนอยู่บ้าง และมีคนรับใช้และทาสของคาลิดอีกหลายร้อยคน ฝ่ายป้องกันมีปืนใหญ่สองสามกระบอกและปืนกลที่ติดตั้งอยู่หน้าพระราชวังโดยเล็งไปยังเรือของอังกฤษ การระดมยิงเปิดฉากเมื่อเวลา 09:02 น. ผลทำให้พระราชวังไฟไหม้และปืนใหญ่ฝ่ายตั้งรับไม่สามารถใช้การได้ มีการปฏิบัติทางเรือขนาดเล็ก โดยฝ่ายอังกฤษสามารถจมเรือยอตช์หลวงของแซนซิบาร์และเรือที่เล็กกว่าได้สองลำ มีการยิงมาที่ทหารแซนซิบาร์ที่นิยมอังกฤษบ้างขณะที่เคลื่อนเข้าสู่พระราชวัง แต่ไร้ผล ธงที่พระราชวังถูกยิงล้ม และการยิงสิ้นสุดลงเมื่อเวลา 09:40 น.
+
+กองกำลังของสุลต่านคาลิดมีกำลังพลสูญเสียประมาณ 500 คน ขณะที่ลูกเรืออังกฤษบาดเจ็บเพียงคนเดียว สุลต่านคาลิดเสด็จลี้ภัยไปยังกงสุลเยอรมนี ก่อนที่จะหลบหนีต่อไปยังแอฟริกาตะวันออกของเยอรมนี (ปัจจุบัน คือ ประเทศแทนซาเนียส่วนแผ่นดินใหญ่) อังกฤษตั้งฮามัดขึ้นเป็นสุลต่านอย่างรวดเร็วเพื่อเป็นผู้นำของรัฐบาลหุ่น สงครามยุติสถานะรัฐเอกราชของแซนซิบาร์และเริ่มต้นยุคที่อังกฤษเข้ามามีอิทธิพลอย่างสูง
+
+แซนซิบาร์เป็นประเทศบนเกาะในมหาสมุทรอินเดีย นอกชายฝั่งแทนแกนยิกา ปัจจุบันเป็นส่วนหนึ่งของประเทศแทนซาเนีย เกาะอยู่ภายใต้การปกครองแต่เพียงในนามของสุลต่านแห่งโอมานตั้งแต่ปี ค.ศ. 1698 เมื่อขับไล่ผู้ตั้งถิ่นฐานชาวโปรตุเกสผู้อ้างสิทธิ์ในเกาะในปี ค.ศ. 1499 ออกไป[8] สุลต่านฮาจีด บิน เซด (Majid bin Said) ประกาศอิสรภาพจากโอมานใน ค.ศ. 1858 ซึ่งการครั้งนี้บริเตนใหญ่ให้การรับรอง และแบ่งแยกรัฐสุลต่านออกจากโอมาน[8] ต่อมาสุลต่านทรงตั้งเมืองหลวงและทำเนียบรัฐบาลขึ้นที่แซนซิบาร์ทาวน์ อันเป็นที่ซึ่งมีการสร้างกลุ่มอาคารพระราชวังติดทะเล ในปี ค.ศ. 1896 กลุ่มอาคารพระราชวังนี้ประกอบด้วย บีต อัล ฮุก์ม (Beit al-Hukm) ฮาเร็มที่ติดกัน และ บีต อัล อาเจบ (Beit al-Ajaib) หรือ "House of Wonder (บ้านมหัศจรรย์)" พระราชวังอันใหญ่โตที่กล่าวกันว่าเป็นสิ่งก่อสร้างแรกในแอฟริกาตะวันออกที่มีไฟฟ้าใช้[9] กลุ่มอาคารส่วนใหญ่สร้างขึ้นจากไม้ท้องถิ่น และมิได้ถูกกำหนดมาให้เป็นสิ่งก่อสร้างเพื่อใช้ป้องกัน[10] อาคารหลังทั้งสามสร้างติดกันเป็นเส้นตรง และเชื่อมต่อกันด้วยสะพานไม้อยู่สูงเหนือถนน[11]
+
+อังกฤษมีปฏิสัมพันธ์ฉันมิตรกับแซนซิบาร์มาช้านาน และยอมรับอธิปไตยและรัฐสุลต่านในปี ค.ศ. 1886[8][12][13] และโดยทั่วไปธำรงความสัมพันธ์อันดีกับประเทศและสุลต่าน[8] อย่างไรก็ตาม เยอรมนีก็สนใจในแอฟริกาตะวันออกเช่นกัน และมหาอำนาจทั้งสองก็แข่งขันเพื่อควบคุมสิทธิการค้าและดินแดนในพื้นที่ตลอดปลายคริสต์ศตวรรษที่ 19[14] สุลต่านคาริฟฟาห์พระราชทานสิทธิในดินแดนเคนยาแก่อังกฤษและสิทธิในดินแดนแทนแกนยิกาแก่เยอรมนี อันส่งผลให้เกิดการเลิกระบบทาสในดินแดนเหล่านั้น[8] ชนชั้นปกครองชาวอาหรับจำนวนมากหัวเสียจากการรบกวนการค้าอันมีค่านี้ ซึ่งส่งผลให้เกิดความไม่สงบอยู่บ้าง[8] นอกจากนี้ ทางการเยอรมนีในแทนแกนยิกาปฏิเสธที่จะชักธงของรัฐสุลต่านแซนซิบาร์ขึ้น ซึ่งนำไปสู่การปะทะกันด้วยอาวุธระหว่างทหารเยอรมันและประชาชนท้องถิ่น[15] หนึ่งในความขัดแย้งในเมืองแทนกามีชาวอาหรับเสียชีวิต 20 คน[15]
+
+สุลต่านคาริฟฟาห์ทรงส่งทหารแซนซิบาร์นำโดยพลเอกลอยด์ แมตทิวส์ (Lloyd Mathews) อดีตเรือโทแห่งกองทัพเรืออังกฤษ ไปฟื้นฟูความสงบเรียบร้อยในแทนแกนยิกา[16] ปฏิบัติการนี้ประสบความสำเร็จอย่างมาก แต่ความรู้สึกต่อต้านเยอรมนีในหมู่ชาวแซนซิบาร์ยังแรงกล้าอยู่[15] ความขัดแย้งปะทุขึ้นอีกที่เมืองบากาโมโย (Bagamoyo) เมื่อชนพื้นเมือง 150 คนถูกทหารเยอรมันสังหาร และที่เคตวา (Ketwa) ที่ข้าราชการเยอรมนีและบ่าวถูกฆ่าตาย[16] สุลต่านคาริฟฟาห์พระราชทานสิทธิการค้ากว้างขวางแก่บริษัทแอฟริกาตะวันออกของจักรวรรดิอังกฤษ (IBEAC) ซึ่ง ด้วยความช่วยเหลือจากเยอรมนี ได้ปิดล้อมทางทะเลเพื่อหยุดการค้าทาสในประเทศที่ดำเนินต่อไป[16] เมื่อสุลต่านคาริฟฟาห์สวรรคตในปี ค.ศ. 1890 อะลี บิน ซัยด์ได้สืบราชบัลลังก์รัฐสุลต่าน[17] สุลต่านอะลีทรงห้ามการค้าทาสในประเทศ (แต่มิได้ทรงห้ามการเป็นเจ้าของทาส) ทรงประกาศให้แซนซิบาร์เป็นรัฐในอารักขาของอังกฤษและแต่งตั้งนายกรัฐมนตรีชาวอังกฤษให้นำคณะรัฐมนตรีในพระองค์ อังกฤษยังได้รับประกันการยับยั้งการแต่งตั้งสุลต่านในอนาคตด้วย[18]
+
+ปีที่สุลต่านอะลีสวรรคต มีการลงนามในสนธิสัญญาเฮลิโกแลนด์-แซนซิบาร์ระหว่างบริเตนและเยอรมนี สนธิสัญญานี้ปักปันเขตอิทธิพลในแอฟริกาตะวันออกและยกสิทธิของเยอรมนีในแซนซิบาร์ให้แก่สหราชอาณาจักร[19] ทำให้รัฐบาลอังกฤษมีอิทธิพลมากขึ้นในแซนซิบาร์ ซึ่งรัฐบาลอังกฤษตั้งใจใช้เพื่อกำจัดความเป็นทาสที่นั่น อันเป็นวัตถุประสงค์ที่ตั้งเป้าไว้มาตั้งแต่ปี ค.ศ. 1804[20][21]
+
+ฮาเม็ด บิน ทูเวไนเป็นสุลต่านสืบต่อจากสุลต่านอะลีในปี ค.ศ. 1893 สุลต่านฮาเม็ดรักษาความสัมพันธ์ที่ใกล้ชิดกับอังกฤษไว้ แต่กลับเกิดความไม่เห็นพ้องในบรรดาคนในบังคับของสุลต่านเรื่องการควบคุมของอังกฤษที่เพิ่มขึ้นทั่วประเทศ กองทัพที่นำโดยอังกฤษ และการเลิกการค้าทาสอันมีค่า[18] เพื่อควบคุมความไม่เห็นพ้องนี้ ทางการอังกฤษจึงอนุญาตให้สุลต่านตั้งองครักษ์พระราชวังชาวแซนซิบาร์จำนวน 1,000 นาย แต่ไม่นานองครักษ์เหล่านี้กลับเข้าไปปะทะกับตำรวจที่นำโดยอังกฤษ[22][23] นอกจากนี้ยังมีคำร้องทุกข์เกี่ยวกับกิจกรรมขององครักษ์จากผู้อยู่อาศัยชาวยุโรปในแซนซิบาร์ทาวน์[18]
+
+สุลต่านฮาเม็ดสวรรคตอย่างกะทันหันเมื่อเวลา 11:40 EAT (08:40 UTC) ในวันที่ 25 สิงหาคม ค.ศ. 1896[18] พระราชนัดดาวัย 29 พรรษา คาลิด บิน บาร์กาช ซึ่งถูกสงสัยว่ามีส่วนในการลอบปลงพระชนม์[18] ย้ายเข้าประทับในพระราชวังที่แซนซิบาร์ทาวน์โดยปราศจากการอนุมัติจากอังกฤษ ซึ่งเป็นการฝ่าฝืนสนธิสัญญาที่อังกฤษตกลงกับสุลต่านอะลี[18] รัฐบาลอังกฤษนิยมผู้มีคุณสมบัติอีกคนหนึ่ง คือ ฮามัด บิน มุฮามเม็ด ผู้มีใจเอนเอียงต่ออังกฤษมากกว่า กงสุลและเจ้าหน้าที่ทางทูตที่ถูกส่งไปยังแซนซิบาร์ บาซิล เคฟ (Basil Cave) และพลเอกแมตทิวส์ เตือนสุลต่านคาลิดให้ทรงดำริถึงการกระทำของพระองค์อย่างรอบคอบ[23][24] วิธีปฏิบัตินี้เคยประสบความสำเร็จเมื่อสามปีก่อนเมื่อสุลต่านคาลิดทรงพยายามอ้างสิทธิเหนือรัฐสุลต่านหลังสุลต่านอะลีสวรรคต และกงสุลใหญ่อังกฤษ เรนแนลล์ รอดด์ (Rennell Rodd) โน้มน้าวให้พระองค์ทราบถึงภยันตรายของการกระทำนั้น[25]
+
+สุลต่านคาลิดทรงเมินเฉยต่อคำเตือนของเคฟ กองกำลังของพระองค์เริ่มรวมพลที่จัตุรัสพระราชวังภายใต้การบังคับบัญชาของร้อยเอกซาเลห์ (Saleh) องครักษ์พระราชวัง เมื่อสิ้นสุดวัน กองกำลังนี้มีจำนวนถึง 2,800 นาย ติดอาวุธปืนเล็กยาวและปืนคาบศิลา[24] ส่วนใหญ่เป็นพลเรือน แต่กองกำลังนี้มีอัสคารีชาวแซนซิบาร์ที่เข้าข้างสุลต่านคาลิด 700 นาย[24][26] ปืนใหญ่ของสุลต่าน ประกอบด้วย ปืนกลแม็กซิมหลายกระบอก ปืนแก็ตลิง 1 กระบอก ปืนใหญ่วิถีราบสำริดสมัยคริสต์ศตวรรษที่ 17 หนึ่งกระบอก และปืนใหญ่สนามขนาด 12 ปอนด์ 2 กระบอก ทั้งหมดเล็งไปที่เรือรบอังกฤษในท่า[24][26][27] ปืนใหญ่สนามขนาด 12 ปอนด์นี้ สุลต่านได้รับถวายจากสมเด็จพระจักรพรรดิวิลเฮล์มที่ 2 จักรพรรดิเยอรมนี[24] กองกำลังสุลต่านยังครอบครองกองทัพเรือแซนซิบาร์อันประกอบด้วย เรือสลุปไม้หนึ่งลำ เรือหลวงกลาสโกว์ (HHS Glasgow) ซึ่งต่อเป็นเรือยอชท์หลวงของสุลต่านในปี ค.ศ. 1878 โดยมีแบบมาจากเรือฟริเกตของอังกฤษ กลาสโกว์ (Glasgow)[28]
+
+แมตทิวส์และเคฟก็เริ่มรวมพลด้วยเช่นกัน ซึ่งบังคับบัญชาอัสคารีชาวแซนซิบาร์อยู่แล้ว 900 คน ในบังคับบัญชาของร้อยโทอาเทอร์ เอ็ดวาร์ด ฮาริงตัน ไรคีส (Arthur Edward Harington Raikes) แห่งกรมทหารวิลท์ไชร์ (Wiltshire Regiment) ผู้เป็นรองผู้บัญชาการกองทัพแซนซิบาร์และมียศพลจัตวา[24] กะลาสีและนาวิกโยธิน 150 นายขึ้นบกจากเรือลาดตระเวนหุ้มเกราะชั้นเพิร์ล ฟิโลเมล (HMS Philomel) และเรือปืน ทรูช (HMS Thrush) ซึ่งทอดสมออยู่ในท่า[24] กองทัพเรือฉุกเฉินภายใต้การบังคับบัญชาของนาวาเอก โอคาล์เลกแฮน (O'Callaghan) ขึ้นฝั่งในสิบห้านาทีหลังได้รับการร้องขอให้จัดการกับจลาจลใด ๆ ที่เกิดจากประชาชนทั่วไป[24][29] กะลาสีกลุ่มเล็กกว่าภายใต้การบังคับบัญชาของเรือเอก วัตซัน (Watson) แห่งเรือทรูชถูกส่งขึ้นฝั่งเพื่อพิทักษ์สถานกงสุลอังกฤษ ที่ซึ่งพลเมืองอังกฤษถูกขอให้มารวมกันเพื่อการคุ้มครอง[24] เรือหลวงสแพร์โรว์ (HMS Sparrow) เรือปืนอีกลำหนึ่ง แล่นเข้าสู่ท่าเรือและทอดสมอตรงข้ามกับพระราชวังถัดจากเรือทรูช[24]
+
+เกิดความกังวลขึ้นในหมู่นักการทูตอังกฤษเกี่ยวกับความน่าเชื่อถือของทหารอัสคารีของไรคีส แต่พวกเขาพิสูจน์แล้วว่าเป็นทหารที่มั่นคงและเป็นมืออาชีพที่กรำด้วยการฝึกทางทหารและการรบนอกประเทศไปยังแอฟริกาตะวันออกหลายครั้ง ภายหลังทหารอัสคารีเหล่านี้เป็นทหารภาคพื้นดินเพียงกลุ่มเดียวที่ถูกฝ่ายตั้งรับยิงใส่[1] ทหารของไรคีสติดอาวุธปืนแม็กซิมสองกระบอก และปืนใหญ่วิถีราบเก้ากระบอก และประจำอยู่ที่โรงภาษีใกล้ ๆ[30] สุลต่านพยายามให้กงสุลสหรัฐ ริชาร์ด ดอร์ซีย์ โมฮัน (Richard Dorsey Mohun) ยอมรับการขึ้นครองราชย์ของพระองค์ แต่ผู้ส่งสารได้รับแจ้งว่า "เนื่องจากการขึ้นครองราชย์ของพระองค์ยังไม่ถูกรัฐบาลในสมเด็จพระราชินีทวนสอบ จึงเป็นไปไม่ได้ที่จะตอบ"[27]
+
+เคฟส่งสารถึงคาลิดอย่างต่อเนื่อง ขอให้พระองค์ยุติปฏิบัติการของกองทหาร เสด็จออกจากพระราชวัง และกลับบ้าน แต่กลับถูกเพิกเฉย และคาลิดทรงตอบกลับมาว่าพระองค์จะประกาศสถาปนาตนเป็นสุลต่านในเวลา 15.00 น. เคฟแถลงว่า การกระทำเช่นนั้นเป็นการกบฏและการเป็นสุลต่านของคาลิดจะไม่ได้รับการรับรองโดยรัฐบาลอังกฤษ[24] เมื่อเวลา 14.30 น. พระศพสุลต่านฮาเม็ดถูกฝัง หลังจากนั้น 30 นาทีพอดี เสียงยิงสลุตจากปืนในพระราชวังประกาศการสืบราชสันตติวงศ์ของคาลิด เคฟไม่สามารถเปิดฉากสงครามได้หากรัฐบาลไม่อนุมัติ จึงส่งโทรเลขถึงกระทรวงการต่างประเทศของรัฐบาลลอร์ดแห่งซอลสบรีในกรุงลอนดอน ความว่า "เราได้รับอนุญาตให้ยิงพระราชวังจากเรือรบหรือไม่ หากความพยายามทั้งหมดที่จะแก้ปัญหาอย่างสันติไร้ผล"[31] ขณะเดียวกัน เคฟแจ้งกงสุลต่างประเทศอื่นทุกคนว่า ธงทุกผืนจะลดลงครึ่งเสาเพื่อถวายเกียรติแด่สุลต่านฮาเม็ด ธงหนึ่งเดียวที่มิลดครึ่งเสานั้นคือธงสีแดงคันใหญ่ซึ่งปลิวสะบัดที่พระราชวังของคาลิด เคฟยังแจ้งกงสุลด้วยว่า ไม่รับรองคาลิดเป็นสุลต่าน ซึ่งเหล่ากงสุลเห็นด้วย[32]
+