diff --git lucene/src/test/org/apache/lucene/search/similarities/LMDirichletSimilarity.java lucene/src/test/org/apache/lucene/search/similarities/LMDirichletSimilarity.java
index 2c228f8..7db0136 100644
--- lucene/src/test/org/apache/lucene/search/similarities/LMDirichletSimilarity.java
+++ lucene/src/test/org/apache/lucene/search/similarities/LMDirichletSimilarity.java
@@ -25,6 +25,12 @@ import org.apache.lucene.search.Explanation;
  * Ad Hoc information retrieval. In Proceedings of the 24th annual international
  * ACM SIGIR conference on Research and development in information retrieval
  * (SIGIR '01). ACM, New York, NY, USA, 334-342.
+ * <p>
+ * The formula as defined the paper assigns a negative score to documents that
+ * contain the term, but with fewer occurrences than predicted by the collection
+ * language model. The Lucene implementation returns {@code 0} for such
+ * documents.
+ * </p>
  * 
  * @lucene.experimental
  */
@@ -55,10 +61,10 @@ public class LMDirichletSimilarity extends LMSimilarity {
   
   @Override
   protected float score(EasyStats stats, float freq, int docLen) {
-    return stats.getTotalBoost() *
-        (float)(Math.log(1 + freq /
-            (mu * ((LMStats)stats).getCollectionProbability())) +
+    float score = stats.getTotalBoost() * (float)(Math.log(1 + freq /
+        (mu * ((LMStats)stats).getCollectionProbability())) +
         Math.log(mu / (docLen + mu)));
+    return score > 0.0f ? score : 0.0f;
   }
   
   @Override
diff --git lucene/src/test/org/apache/lucene/search/similarities/LMSimilarity.java lucene/src/test/org/apache/lucene/search/similarities/LMSimilarity.java
index 971a4d1..ab8a653 100644
--- lucene/src/test/org/apache/lucene/search/similarities/LMSimilarity.java
+++ lucene/src/test/org/apache/lucene/search/similarities/LMSimilarity.java
@@ -136,12 +136,12 @@ public abstract class LMSimilarity extends EasySimilarity {
   
   /**
    * Models {@code p(w|C)} as the number of occurrences of the term in the
-   * collection, divided by the total number of tokens.
+   * collection, divided by the total number of tokens {@code + 1}.
    */
   public static class DefaultCollectionModel implements CollectionModel {
     @Override
     public float computeProbability(EasyStats stats) {
-      return (float)stats.getTotalTermFreq() / stats.getNumberOfFieldTokens();
+      return (float)stats.getTotalTermFreq() / (stats.getNumberOfFieldTokens() +1);
     }
     
     @Override
diff --git lucene/src/test/org/apache/lucene/search/similarities/TestEasySimilarity.java lucene/src/test/org/apache/lucene/search/similarities/TestEasySimilarity.java
index ad7799b..fd2bf10 100644
--- lucene/src/test/org/apache/lucene/search/similarities/TestEasySimilarity.java
+++ lucene/src/test/org/apache/lucene/search/similarities/TestEasySimilarity.java
@@ -459,4 +459,4 @@ public class TestEasySimilarity extends LuceneTestCase {
       return sim;
     }
   }
-}
\ No newline at end of file
+}
