The type parameters are getting a little long for `SentenceSegmenter` and others.... Is there any value in having them as type parameters of the trait, or could they just be abstract type members that subclasses specify? E.g.:

```scala
trait AnalysisFunction[C,B,I<:B,O<:B] {
  type C
  type B
  type I <: B
  type O <: B
}

trait SentenceSegmenter extends AnalysisFunction {
  type C = String
  type B = StringAnnotation
  // ...
}
```