throws IOException {
initializeIfRequired();
final List<AnalyzedTokenReadings> tokenReadings = new ArrayList<>();
int pos = 0;
final IStemmer dictLookup = new DictionaryLookup(getDictionary());
for (String word : sentenceTokens) {
final List<AnalyzedToken> l = new ArrayList<>();
final String lowerWord = word.toLowerCase(conversionLocale);
final boolean isLowercase = word.equals(lowerWord);
final boolean isMixedCase = StringTools.isMixedCase(word);
List<AnalyzedToken> manualTaggerTokens=manualTagsAsAnalyzedTokenList(word, manualTagger.lookup(word));
List<AnalyzedToken> manualLowerTaggerTokens=manualTagsAsAnalyzedTokenList(word, manualTagger.lookup(lowerWord));
// normal case, manual tagger
addTokens(manualTaggerTokens, l);
// normal case, tagger dictionary
if (manualTaggerTokens.isEmpty()) {
addTokens(asAnalyzedTokenList(word, dictLookup.lookup(word)), l);
}
// tag non-lowercase words (alluppercase or startuppercase but not mixedcase)
// with lowercase word tags
if (!isLowercase && !isMixedCase) {
// manual tagger
addTokens(manualLowerTaggerTokens, l);
// tagger dictionary
if (manualLowerTaggerTokens.isEmpty()) {
addTokens(asAnalyzedTokenList(word, dictLookup.lookup(lowerWord)), l);
}
}
// additional tagging with prefixes
if (l.isEmpty() && !isMixedCase) {
addTokens(additionalTags(word), l);