Skip to content

Commit 1616779

Browse files
committed
[CODEC-125] Implement a Beider-Morse phonetic matching codec. Apply Matthew's patch https://issues.apache.org/jira/secure/attachment/12489548/performanceAndBugs.patch
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/codec/trunk@1154423 13f79535-47bb-0310-9956-ffa450edef68
1 parent 8913cb4 commit 1616779

7 files changed

Lines changed: 406 additions & 130 deletions

File tree

src/java/org/apache/commons/codec/language/bm/PhoneticEngine.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.Locale;
2828
import java.util.Map;
2929
import java.util.Set;
30+
import java.util.TreeSet;
3031

3132
/**
3233
* <p>
@@ -61,7 +62,7 @@ private PhonemeBuilder(Set<Rule.Phoneme> phonemes) {
6162
this.phonemes = phonemes;
6263
}
6364

64-
public PhonemeBuilder append(String str) {
65+
public PhonemeBuilder append(CharSequence str) {
6566
Set<Rule.Phoneme> newPhonemes = new HashSet<Rule.Phoneme>();
6667

6768
for (Rule.Phoneme ph : this.phonemes) {
@@ -91,19 +92,14 @@ public Set<Rule.Phoneme> getPhonemes() {
9192
}
9293

9394
public String makeString() {
94-
List<String> sorted = new ArrayList<String>();
9595

96-
for (Rule.Phoneme ph : this.phonemes) {
97-
sorted.add(ph.getPhonemeText());
98-
}
99-
100-
Collections.sort(sorted);
10196
StringBuilder sb = new StringBuilder();
97+
// System.err.println(this.phonemes.getClass());
10298

103-
for (String ph : sorted) {
99+
for (Rule.Phoneme ph : this.phonemes) {
104100
if (sb.length() > 0)
105101
sb.append("|");
106-
sb.append(ph);
102+
sb.append(ph.getPhonemeText());
107103
}
108104

109105
return sb.toString();
@@ -112,13 +108,13 @@ public String makeString() {
112108

113109
private static class RulesApplication {
114110
private final List<Rule> finalRules;
115-
private final String input;
111+
private final CharSequence input;
116112

117113
private PhonemeBuilder phonemeBuilder;
118114
private int i;
119115
private boolean found;
120116

121-
public RulesApplication(List<Rule> finalRules, String input, PhonemeBuilder phonemeBuilder, int i) {
117+
public RulesApplication(List<Rule> finalRules, CharSequence input, PhonemeBuilder phonemeBuilder, int i) {
122118
if (finalRules == null) {
123119
throw new NullPointerException("The finalRules argument must not be null");
124120
}
@@ -227,11 +223,11 @@ private PhonemeBuilder applyFinalRules(PhonemeBuilder phonemeBuilder, List<Rule>
227223
return phonemeBuilder;
228224
}
229225

230-
Set<Rule.Phoneme> phonemes = new HashSet<Rule.Phoneme>();
226+
Set<Rule.Phoneme> phonemes = new TreeSet<Rule.Phoneme>();
231227

232228
for (Rule.Phoneme phoneme : phonemeBuilder.getPhonemes()) {
233229
PhonemeBuilder subBuilder = PhonemeBuilder.empty(phoneme.getLanguages());
234-
String phonemeText = phoneme.getPhonemeText();
230+
CharSequence phonemeText = phoneme.getPhonemeText();
235231
// System.err.println("Expanding: " + phonemeText);
236232

237233
for (int i = 0; i < phonemeText.length();) {
@@ -241,7 +237,7 @@ private PhonemeBuilder applyFinalRules(PhonemeBuilder phonemeBuilder, List<Rule>
241237

242238
if (!found) {
243239
// System.err.println("Not found. Appending as-is");
244-
subBuilder = subBuilder.append(phonemeText.substring(i, i + 1));
240+
subBuilder = subBuilder.append(phonemeText.subSequence(i, i + 1));
245241
}
246242

247243
i = rulesApplication.getI();
@@ -331,14 +327,14 @@ public String phoneticUtf8(String input, final Languages.LanguageSet languageSet
331327
// check for any prefix in the words list
332328
String remainder = input.substring(l.length() + 1); // input without the prefix
333329
String combined = l + remainder; // input with prefix without space
334-
return encode(remainder) + "-" + encode(combined);
330+
return "(" + encode(remainder) + ")-(" + encode(combined) + ")";
335331
}
336332
// fixme: this case is invariant on l
337333
else if (input.length() >= 2 && input.substring(0, 2).equals("d'")) // check for d'
338334
{
339335
String remainder = input.substring(2);
340336
String combined = "d" + remainder;
341-
return encode(remainder) + "-" + encode(combined);
337+
return "(" + encode(remainder) + ")-(" + encode(combined) + ")";
342338
}
343339
}
344340
}

0 commit comments

Comments
 (0)