|
|
/*
|
|
|
* Port of Snowball stemmers on C#
|
|
|
* Original stemmers can be found on http://snowball.tartarus.org
|
|
|
* Licence still BSD: http://snowball.tartarus.org/license.php
|
|
|
*
|
|
|
* Most of stemmers are ported from Java by Iveonik Systems ltd. (www.iveonik.com)
|
|
|
*/
|
|
|
using System.Text;
|
|
|
|
|
|
namespace Iveonik.Stemmers
|
|
|
{
|
|
|
public class StemmerOperations
|
|
|
{
|
|
|
// // current string
|
|
|
protected StringBuilder current;
|
|
|
protected int cursor;
|
|
|
protected int limit;
|
|
|
protected int limit_backward;
|
|
|
protected int bra;
|
|
|
protected int ket;
|
|
|
|
|
|
protected StemmerOperations()
|
|
|
{
|
|
|
current = new StringBuilder();
|
|
|
setCurrent("");
|
|
|
}
|
|
|
|
|
|
// /**
|
|
|
// * Set the current string.
|
|
|
// */
|
|
|
protected void setCurrent(string value)
|
|
|
{
|
|
|
// current.replace(0, current.length(), value);
|
|
|
//current=current.Replace(current.ToString(), value);
|
|
|
//current = StringBufferReplace(0, current.Length, current, value);
|
|
|
//current = StringBufferReplace(0, value.Length, current, value);
|
|
|
current.Remove(0, current.Length);
|
|
|
current.Append(value);
|
|
|
cursor = 0;
|
|
|
limit = current.Length;
|
|
|
limit_backward = 0;
|
|
|
bra = cursor;
|
|
|
ket = limit;
|
|
|
}
|
|
|
|
|
|
// /**
|
|
|
// * Get the current string.
|
|
|
// */
|
|
|
protected string getCurrent()
|
|
|
{
|
|
|
string result = current.ToString();
|
|
|
// Make a new StringBuffer. If we reuse the old one, and a user of
|
|
|
// the library keeps a reference to the buffer returned (for example,
|
|
|
// by converting it to a String in a way which doesn't force a copy),
|
|
|
// the buffer size will not decrease, and we will risk wasting a large
|
|
|
// amount of memory.
|
|
|
// Thanks to Wolfram Esser for spotting this problem.
|
|
|
//current = new StringBuilder();
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
protected void copy_from(StemmerOperations other)
|
|
|
{
|
|
|
current = other.current;
|
|
|
cursor = other.cursor;
|
|
|
limit = other.limit;
|
|
|
limit_backward = other.limit_backward;
|
|
|
bra = other.bra;
|
|
|
ket = other.ket;
|
|
|
}
|
|
|
|
|
|
protected bool in_grouping(char[] s, int min, int max)
|
|
|
{
|
|
|
if (cursor >= limit) return false;
|
|
|
// char ch = current.charAt(cursor);
|
|
|
int ch = current[cursor];
|
|
|
if (ch > max || ch < min) return false;
|
|
|
// ch -= min;
|
|
|
ch -= min;
|
|
|
if ((s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return false;
|
|
|
cursor++;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
protected bool in_grouping_b(char[] s, int min, int max)
|
|
|
{
|
|
|
if (cursor <= limit_backward) return false;
|
|
|
// char ch = current.charAt(cursor - 1);
|
|
|
int ch = (int)current[cursor - 1];
|
|
|
if (ch > max || ch < min) return false;
|
|
|
ch -= min;
|
|
|
if ((s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return false;
|
|
|
cursor--;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
protected bool out_grouping(char[] s, int min, int max)
|
|
|
{
|
|
|
if (cursor >= limit) return false;
|
|
|
// char ch = current.charAt(cursor);
|
|
|
int ch = current[cursor];
|
|
|
if (ch > max || ch < min)
|
|
|
{
|
|
|
cursor++;
|
|
|
return true;
|
|
|
}
|
|
|
ch -= min;
|
|
|
if ((s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
|
|
|
{
|
|
|
cursor++;
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
protected bool out_grouping_b(char[] s, int min, int max)
|
|
|
{
|
|
|
if (cursor <= limit_backward) return false;
|
|
|
// char ch = current.charAt(cursor - 1);
|
|
|
int ch = (int)current[cursor - 1];
|
|
|
if (ch > max || ch < min)
|
|
|
{
|
|
|
cursor--;
|
|
|
return true;
|
|
|
}
|
|
|
ch -= min;
|
|
|
if ((s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
|
|
|
{
|
|
|
cursor--;
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
protected bool in_range(int min, int max)
|
|
|
{
|
|
|
if (cursor >= limit) return false;
|
|
|
// char ch = current.charAt(cursor);
|
|
|
int ch = (int)current[cursor];
|
|
|
if (ch > max || ch < min) return false;
|
|
|
cursor++;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
protected bool in_range_b(int min, int max)
|
|
|
{
|
|
|
if (cursor <= limit_backward) return false;
|
|
|
// char ch = current.charAt(cursor - 1);
|
|
|
int ch = (int)current[cursor - 1];
|
|
|
if (ch > max || ch < min) return false;
|
|
|
cursor--;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
protected bool out_range(int min, int max)
|
|
|
{
|
|
|
if (cursor >= limit) return false;
|
|
|
// char ch = current.charAt(cursor);
|
|
|
int ch = (int)current[cursor];
|
|
|
if (!(ch > max || ch < min)) return false;
|
|
|
cursor++;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
protected bool out_range_b(int min, int max)
|
|
|
{
|
|
|
if (cursor <= limit_backward) return false;
|
|
|
// char ch = current.charAt(cursor - 1);
|
|
|
int ch = (int)current[cursor - 1];
|
|
|
if (!(ch > max || ch < min)) return false;
|
|
|
cursor--;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
protected bool eq_s(int s_size, string s)
|
|
|
{
|
|
|
if (limit - cursor < s_size) return false;
|
|
|
int i;
|
|
|
for (i = 0; i != s_size; i++)
|
|
|
{
|
|
|
if (current[cursor + i] != s[i]) return false;
|
|
|
// if (current[cursor + i] != s[i]) return false;
|
|
|
}
|
|
|
cursor += s_size;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
protected bool eq_s_b(int s_size, string s)
|
|
|
{
|
|
|
if (cursor - limit_backward < s_size) return false;
|
|
|
int i;
|
|
|
for (i = 0; i != s_size; i++)
|
|
|
{
|
|
|
// if (current.charAt(cursor - s_size + i) != s.charAt(i)) return false;
|
|
|
if (current[cursor - s_size + i] != s[i]) return false;
|
|
|
}
|
|
|
cursor -= s_size;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
protected bool eq_v(StringBuilder s)
|
|
|
{
|
|
|
return eq_s(s.Length, s.ToString());
|
|
|
}
|
|
|
|
|
|
protected bool eq_v_b(StringBuilder s)
|
|
|
{
|
|
|
return eq_s_b(s.Length, s.ToString());
|
|
|
}
|
|
|
|
|
|
|
|
|
internal int find_among(Among[] v, int v_size)
|
|
|
{
|
|
|
int i = 0;
|
|
|
int j = v_size;
|
|
|
|
|
|
int c = cursor;
|
|
|
int l = limit;
|
|
|
|
|
|
int common_i = 0;
|
|
|
int common_j = 0;
|
|
|
|
|
|
bool first_key_inspected = false;
|
|
|
while (true)
|
|
|
{
|
|
|
int k = i + ((j - i) >> 1);
|
|
|
int diff = 0;
|
|
|
int common = common_i < common_j ? common_i : common_j; // smaller
|
|
|
Among w = v[k];
|
|
|
int i2;
|
|
|
|
|
|
for (i2 = common; i2 < w.s_size; i2++)
|
|
|
{
|
|
|
if (c + common == l)
|
|
|
{
|
|
|
diff = -1;
|
|
|
break;
|
|
|
}
|
|
|
diff = current[c + common] - w.s[i2];
|
|
|
if (diff != 0) break;
|
|
|
common++;
|
|
|
}
|
|
|
if (diff < 0)
|
|
|
{
|
|
|
j = k;
|
|
|
common_j = common;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
i = k;
|
|
|
common_i = common;
|
|
|
}
|
|
|
if (j - i <= 1)
|
|
|
{
|
|
|
if (i > 0) break; // v->s has been inspected
|
|
|
if (j == i) break; // only one item in v
|
|
|
// - but now we need to go round once more to get
|
|
|
// v->s inspected. This looks messy, but is actually
|
|
|
// the optimal approach.
|
|
|
if (first_key_inspected) break;
|
|
|
first_key_inspected = true;
|
|
|
}
|
|
|
}
|
|
|
while (true)
|
|
|
{
|
|
|
Among w = v[i];
|
|
|
if (common_i >= w.s_size)
|
|
|
{
|
|
|
cursor = c + w.s_size;
|
|
|
if (w.method == null) return w.result;
|
|
|
//bool res;
|
|
|
//try
|
|
|
//{
|
|
|
// Object resobj = w.method.invoke(w.methodobject,new Object[0]);
|
|
|
// res = resobj.toString().equals("true");
|
|
|
//}
|
|
|
//catch (InvocationTargetException e)
|
|
|
//{
|
|
|
// res = false;
|
|
|
// // FIXME - debug message
|
|
|
//}
|
|
|
//catch (IllegalAccessException e)
|
|
|
//{
|
|
|
// res = false;
|
|
|
//// FIXME - debug message
|
|
|
//}
|
|
|
//cursor = c + w.s_size;
|
|
|
//if (res) return w.result;
|
|
|
}
|
|
|
i = w.substring_i;
|
|
|
if (i < 0) return 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// // find_among_b is for backwards processing. Same comments apply
|
|
|
|
|
|
internal int find_among_b(Among[] v, int v_size)
|
|
|
{
|
|
|
int i = 0;
|
|
|
int j = v_size;
|
|
|
int c = cursor;
|
|
|
int lb = limit_backward;
|
|
|
int common_i = 0;
|
|
|
int common_j = 0;
|
|
|
bool first_key_inspected = false;
|
|
|
while (true)
|
|
|
{
|
|
|
int k = i + ((j - i) >> 1);
|
|
|
int diff = 0;
|
|
|
int common = common_i < common_j ? common_i : common_j;
|
|
|
Among w = v[k];
|
|
|
int i2;
|
|
|
for (i2 = w.s_size - 1 - common; i2 >= 0; i2--)
|
|
|
{
|
|
|
if (c - common == lb)
|
|
|
{
|
|
|
diff = -1;
|
|
|
break;
|
|
|
}
|
|
|
// diff = current.charAt(c - 1 - common) - w.s[i2];
|
|
|
diff = current[c - 1 - common] - w.s[i2];
|
|
|
if (diff != 0) break;
|
|
|
common++;
|
|
|
}
|
|
|
if (diff < 0)
|
|
|
{
|
|
|
j = k;
|
|
|
common_j = common;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
i = k;
|
|
|
common_i = common;
|
|
|
}
|
|
|
if (j - i <= 1)
|
|
|
{
|
|
|
if (i > 0) break;
|
|
|
if (j == i) break;
|
|
|
if (first_key_inspected) break;
|
|
|
first_key_inspected = true;
|
|
|
}
|
|
|
}
|
|
|
while (true)
|
|
|
{
|
|
|
Among w = v[i];
|
|
|
if (common_i >= w.s_size)
|
|
|
{
|
|
|
cursor = c - w.s_size;
|
|
|
if (w.method == null) return w.result;
|
|
|
//boolean res;
|
|
|
//try
|
|
|
//{
|
|
|
// Object resobj = w.method.invoke(w.methodobject,
|
|
|
// new Object[0]);
|
|
|
// res = resobj.toString().equals("true");
|
|
|
// }
|
|
|
//catch (InvocationTargetException e)
|
|
|
//{
|
|
|
// res = false;
|
|
|
// // FIXME - debug message
|
|
|
// }
|
|
|
//catch (IllegalAccessException e)
|
|
|
//{
|
|
|
// res = false;
|
|
|
// // FIXME - debug message
|
|
|
// }
|
|
|
//cursor = c - w.s_size;
|
|
|
//if (res) return w.result;
|
|
|
}
|
|
|
i = w.substring_i;
|
|
|
if (i < 0) return 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// /* to replace chars between c_bra and c_ket in current by the
|
|
|
// * chars in s.
|
|
|
// */
|
|
|
protected int replace_s(int c_bra, int c_ket, string s)
|
|
|
{
|
|
|
int adjustment = s.Length - (c_ket - c_bra);
|
|
|
// current.replace(c_bra, c_ket, s);
|
|
|
current = StringBufferReplace(c_bra, c_ket, current, s);
|
|
|
limit += adjustment;
|
|
|
if (cursor >= c_ket) cursor += adjustment;
|
|
|
else if (cursor > c_bra) cursor = c_bra;
|
|
|
return adjustment;
|
|
|
}
|
|
|
|
|
|
private StringBuilder StringBufferReplace(int start, int end, StringBuilder s, string s1)
|
|
|
{
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
for (int i = 0; i < start; i++)
|
|
|
{
|
|
|
sb.Insert(sb.Length, s[i]);
|
|
|
}
|
|
|
// for (int i = 1; i < end - start + 1; i++)
|
|
|
// {
|
|
|
sb.Insert(sb.Length, s1);
|
|
|
// }
|
|
|
for (int i = end; i < s.Length; i++)
|
|
|
{
|
|
|
sb.Insert(sb.Length, s[i]);
|
|
|
}
|
|
|
|
|
|
return sb;
|
|
|
//string temp = s.ToString();
|
|
|
//temp = temp.Substring(start - 1, end - start + 1);
|
|
|
//s = s.Replace(temp, s1, start - 1, end - start + 1);
|
|
|
//return s;
|
|
|
}
|
|
|
|
|
|
protected void slice_check()
|
|
|
{
|
|
|
if (bra < 0 ||
|
|
|
bra > ket ||
|
|
|
ket > limit ||
|
|
|
limit > current.Length) // this line could be removed
|
|
|
{
|
|
|
//System.err.println("faulty slice operation");
|
|
|
// FIXME: report error somehow.
|
|
|
/*
|
|
|
fprintf(stderr, "faulty slice operation:\n");
|
|
|
debug(z, -1, 0);
|
|
|
exit(1);
|
|
|
*/
|
|
|
}
|
|
|
}
|
|
|
|
|
|
protected void slice_from(string s)
|
|
|
{
|
|
|
slice_check();
|
|
|
replace_s(bra, ket, s);
|
|
|
}
|
|
|
|
|
|
protected void slice_from(StringBuilder s)
|
|
|
{
|
|
|
slice_from(s.ToString());
|
|
|
}
|
|
|
|
|
|
protected void slice_del()
|
|
|
{
|
|
|
slice_from("");
|
|
|
}
|
|
|
|
|
|
protected void insert(int c_bra, int c_ket, string s)
|
|
|
{
|
|
|
int adjustment = replace_s(c_bra, c_ket, s);
|
|
|
if (c_bra <= bra) bra += adjustment;
|
|
|
if (c_bra <= ket) ket += adjustment;
|
|
|
}
|
|
|
|
|
|
protected void insert(int c_bra, int c_ket, StringBuilder s)
|
|
|
{
|
|
|
insert(c_bra, c_ket, s.ToString());
|
|
|
}
|
|
|
|
|
|
// /* Copy the slice into the supplied StringBuffer */
|
|
|
protected StringBuilder slice_to(StringBuilder s)
|
|
|
{
|
|
|
slice_check();
|
|
|
int len = ket - bra;
|
|
|
// s.replace(0, s.length(), current.substring(bra, ket));
|
|
|
// int lengh = string.IsNullOrEmpty(s.ToString())!= true ? s.Length : 0;
|
|
|
// if (ket == current.Length) ket--;
|
|
|
//string ss = current.ToString().Substring(bra, len);
|
|
|
//StringBufferReplace(0, s.Length, s, ss);
|
|
|
//return s;
|
|
|
return StringBufferReplace(0, s.Length, s, current.ToString().Substring(bra, len));
|
|
|
// return StringBufferReplace(0, lengh, s, current.ToString().Substring(bra, ket));
|
|
|
// return s;
|
|
|
}
|
|
|
|
|
|
// /* Copy the slice into the supplied StringBuilder */
|
|
|
//protected StringBuilder slice_to(StringBuilder s)
|
|
|
//{
|
|
|
// slice_check();
|
|
|
// int len = ket - bra;
|
|
|
// s.replace(0, s.length(), current.substring(bra, ket));
|
|
|
// return s;
|
|
|
//}
|
|
|
|
|
|
protected StringBuilder assign_to(StringBuilder s)
|
|
|
{
|
|
|
//s.replace(0, s.length(), current.substring(0, limit));
|
|
|
//return s;
|
|
|
return StringBufferReplace(0, s.Length, s, current.ToString().Substring(0, limit));
|
|
|
}
|
|
|
|
|
|
// protected StringBuilder assign_to(StringBuilder s)
|
|
|
// {
|
|
|
// s.replace(0, s.length(), current.substring(0, limit));
|
|
|
// return s;
|
|
|
// }
|
|
|
|
|
|
///*
|
|
|
//extern void debug(struct SN_env * z, int number, int line_count)
|
|
|
//{ int i;
|
|
|
// int limit = SIZE(z->p);
|
|
|
// //if (number >= 0) printf("%3d (line %4d): '", number, line_count);
|
|
|
// if (number >= 0) printf("%3d (line %4d): [%d]'", number, line_count,limit);
|
|
|
// for (i = 0; i <= limit; i++)
|
|
|
// { if (z->lb == i) printf("{");
|
|
|
// if (z->bra == i) printf("[");
|
|
|
// if (z->c == i) printf("|");
|
|
|
// if (z->ket == i) printf("]");
|
|
|
// if (z->l == i) printf("}");
|
|
|
// if (i < limit)
|
|
|
// { int ch = z->p[i];
|
|
|
// if (ch == 0) ch = '#';
|
|
|
// printf("%c", ch);
|
|
|
// }
|
|
|
// }
|
|
|
// printf("'\n");
|
|
|
//}
|
|
|
//*/
|
|
|
|
|
|
//};
|
|
|
///////////////////////////// METHODS FOR CZECH STEMMER AGRESSIVE //////////////////////////////////
|
|
|
protected void removeDerivational()
|
|
|
{
|
|
|
int len = current.Length;
|
|
|
if ((len > 8) &&
|
|
|
current.ToString().Substring(len - 6, 6).Equals("obinec"))
|
|
|
{
|
|
|
current = current.Remove(len - 6, 6);
|
|
|
return;
|
|
|
}//len >8
|
|
|
if (len > 7)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 5, 5).Equals("ion\u00e1\u0159"))
|
|
|
{ // -ionář
|
|
|
|
|
|
current = current.Remove(len - 4, 4);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 5, 5).Equals("ovisk") ||
|
|
|
current.ToString().Substring(len - 5, 5).Equals("ovstv") ||
|
|
|
current.ToString().Substring(len - 5, 5).Equals("ovi\u0161t") || //-ovišt
|
|
|
current.ToString().Substring(len - 5, 5).Equals("ovn\u00edk"))
|
|
|
{ //-ovník
|
|
|
|
|
|
current = current.Remove(len - 5, 5);
|
|
|
return;
|
|
|
}
|
|
|
}//len>7
|
|
|
if (len > 6)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 4, 4).Equals("\u00e1sek") || // -ásek
|
|
|
current.ToString().Substring(len - 4, 4).Equals("loun") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("nost") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("teln") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("ovec") ||
|
|
|
current.ToString().Substring(len - 5, 5).Equals("ov\u00edk") || //-ovík
|
|
|
current.ToString().Substring(len - 4, 4).Equals("ovtv") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("ovin") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("\u0161tin"))
|
|
|
{ //-štin
|
|
|
|
|
|
current = current.Remove(len - 4, 4);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 4, 4).Equals("enic") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("inec") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("itel"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
}//len>6
|
|
|
if (len > 5)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("\u00e1rn"))
|
|
|
{ //-árn
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("\u011bnk"))
|
|
|
{ //-ěnk
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
palatalise();
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("i\u00e1n") || //-ián
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ist") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("isk") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("i\u0161t") || //-išt
|
|
|
current.ToString().Substring(len - 3, 3).Equals("itb") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00edrn"))
|
|
|
{ //-írn
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("och") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ost") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ovn") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("oun") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("out") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ou\u0161"))
|
|
|
{ //-ouš
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("u\u0161k"))
|
|
|
{ //-ušk
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("kyn") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u010dan") || //-čan
|
|
|
current.ToString().Substring(len - 3, 3).Equals("k\u00e1\u0159") || //kář
|
|
|
current.ToString().Substring(len - 3, 3).Equals("n\u00e9\u0159") || //néř
|
|
|
current.ToString().Substring(len - 3, 3).Equals("n\u00edk") || //-ník
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ctv") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("stv"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
return;
|
|
|
}
|
|
|
}//len>5
|
|
|
if (len > 4)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("\u00e1\u010d") || // -áč
|
|
|
current.ToString().Substring(len - 2, 2).Equals("a\u010d") || //-ač
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00e1n") || //-án
|
|
|
current.ToString().Substring(len - 2, 2).Equals("an") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00e1\u0159") || //-ář
|
|
|
current.ToString().Substring(len - 2, 2).Equals("as"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("ec") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("en") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u011bn") || //-ěn
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00e9\u0159"))
|
|
|
{ //-éř
|
|
|
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("\u00ed\u0159") || //-íř
|
|
|
current.ToString().Substring(len - 2, 2).Equals("ic") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("in") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00edn") || //-ín
|
|
|
current.ToString().Substring(len - 2, 2).Equals("it") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("iv"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("ob") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("ot") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("ov") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("o\u0148"))
|
|
|
{ //-oň
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("ul"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("yn"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("\u010dk") || //-čk
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u010dn") || //-čn
|
|
|
current.ToString().Substring(len - 2, 2).Equals("dl") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("nk") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("tv") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("tk") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("vk"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
}//len>4
|
|
|
if (len > 3)
|
|
|
{
|
|
|
if (current.ToString()[current.Length - 1] == 'c' ||
|
|
|
current.ToString()[current.Length - 1] == '\u010d' || //-č
|
|
|
current.ToString()[current.Length - 1] == 'k' ||
|
|
|
current.ToString()[current.Length - 1] == 'l' ||
|
|
|
current.ToString()[current.Length - 1] == 'n' ||
|
|
|
current.ToString()[current.Length - 1] == 't')
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
return;
|
|
|
}
|
|
|
}//len>3
|
|
|
}//removeDerivational
|
|
|
|
|
|
protected void removeAugmentative()
|
|
|
{
|
|
|
int len = current.Length;
|
|
|
//
|
|
|
if ((len > 6) &&
|
|
|
current.ToString().Substring(len - 4, 4).Equals("ajzn"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 4, 4);
|
|
|
return;
|
|
|
}
|
|
|
if ((len > 5) &&
|
|
|
(current.ToString().Substring(len - 3, 3).Equals("izn") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("isk")))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if ((len > 4) &&
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\00e1k"))
|
|
|
{ //-ák
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
protected void removeDiminutive()
|
|
|
{
|
|
|
int len = current.Length;
|
|
|
//
|
|
|
if ((len > 7) &&
|
|
|
current.ToString().Substring(len - 5, 5).Equals("ou\u0161ek"))
|
|
|
{ //-oušek
|
|
|
|
|
|
current = current.Remove(len - 5, 5);
|
|
|
return;
|
|
|
}
|
|
|
if (len > 6)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 4, 4).Equals("e\u010dek") || //-eček
|
|
|
current.ToString().Substring(len - 4, 4).Equals("\u00e9\u010dek") || //-éček
|
|
|
current.ToString().Substring(len - 4, 4).Equals("i\u010dek") || //-iček
|
|
|
current.ToString().Substring(len - 4, 4).Equals("\u00ed\u010dek") || //íček
|
|
|
current.ToString().Substring(len - 4, 4).Equals("enek") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("\u00e9nek") || //-ének
|
|
|
current.ToString().Substring(len - 4, 4).Equals("inek") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("\u00ednek"))
|
|
|
{ //-ínek
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 4, 4).Equals("\u00e1\u010dek") || //áček
|
|
|
current.ToString().Substring(len - 4, 4).Equals("a\u010dek") || //aček
|
|
|
current.ToString().Substring(len - 4, 4).Equals("o\u010dek") || //oček
|
|
|
current.ToString().Substring(len - 4, 4).Equals("u\u010dek") || //uček
|
|
|
current.ToString().Substring(len - 4, 4).Equals("anek") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("onek") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("unek") ||
|
|
|
current.ToString().Substring(len - 4, 4).Equals("\u00e1nek"))
|
|
|
{ //-ánek
|
|
|
|
|
|
current = current.Remove(len - 4, 4);
|
|
|
return;
|
|
|
}
|
|
|
}//len>6
|
|
|
if (len > 5)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("e\u010dk") || //-ečk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00e9\u010dk") || //-éčk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("i\u010dk") || //-ičk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00ed\u010dk") || //-íčk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("enk") || //-enk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00e9nk") || //-énk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ink") || //-ink
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00ednk"))
|
|
|
{ //-ínk
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("\u00e1\u010dk") || //-áčk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("au010dk") || //-ačk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("o\u010dk") || //-očk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("u\u010dk") || //-učk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ank") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("onk") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("unk"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("\u00e1tk") || //-átk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00e1nk") || //-ánk
|
|
|
current.ToString().Substring(len - 3, 3).Equals("u\u0161k"))
|
|
|
{ //-ušk
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
return;
|
|
|
}
|
|
|
}//len>5
|
|
|
if (len > 4)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("ek") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00e9k") || //-ék
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00edk") || //-ík
|
|
|
current.ToString().Substring(len - 2, 2).Equals("ik"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("\u00e1k") || //-ák
|
|
|
current.ToString().Substring(len - 2, 2).Equals("ak") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("ok") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("uk"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
if ((len > 3) &&
|
|
|
current.ToString().Substring(len - 1, 1).Equals("k"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
return;
|
|
|
}
|
|
|
}//removeDiminutives
|
|
|
|
|
|
protected void removeComparative()
|
|
|
{
|
|
|
int len = current.Length;
|
|
|
//
|
|
|
if ((len > 5) &&
|
|
|
(current.ToString().Substring(len - 3, 3).Equals("ej\u0161") || //-ejš
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u011bj\u0161")))
|
|
|
{ //-ějš
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void palatalise()
|
|
|
{
|
|
|
int len = current.Length;
|
|
|
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("ci") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("ce") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u010di") || //-či
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u010de"))
|
|
|
{ //-če
|
|
|
|
|
|
current = StringBufferReplace(len - 2, len, current, "k");
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("zi") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("ze") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u017ei") || //-ži
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u017ee"))
|
|
|
{ //-že
|
|
|
|
|
|
current = StringBufferReplace(len - 2, len, current, "h");
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("\u010dt\u011b") || //-čtě
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u010dti") || //-čti
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u010dt\u00ed"))
|
|
|
{ //-čtí
|
|
|
|
|
|
current = StringBufferReplace(len - 3, len, current, "ck");
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("\u0161t\u011b") || //-ště
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u0161ti") || //-šti
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u0161t\u00ed"))
|
|
|
{ //-ští
|
|
|
|
|
|
current = StringBufferReplace(len - 2, len, current, "sk");
|
|
|
return;
|
|
|
}
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
return;
|
|
|
}//palatalise
|
|
|
|
|
|
protected void removePossessives()
|
|
|
{
|
|
|
int len = current.Length;
|
|
|
|
|
|
if (len > 5)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("ov"))
|
|
|
{
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("\u016fv"))
|
|
|
{ //-ův
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("in"))
|
|
|
{
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}//removePossessives
|
|
|
|
|
|
protected void removeCase()
|
|
|
{
|
|
|
int len = current.Length;
|
|
|
//
|
|
|
if ((len > 7) &&
|
|
|
current.ToString().Substring(len - 5, 5).Equals("atech"))
|
|
|
{
|
|
|
current = current.Remove(len - 5, 5);
|
|
|
return;
|
|
|
}//len>7
|
|
|
if (len > 6)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 4, 4).Equals("\u011btem"))
|
|
|
{ //-ětem
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 4, 4).Equals("at\u016fm"))
|
|
|
{ //-atům
|
|
|
current = current.Remove(len - 4, 4);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
if (len > 5)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("ech") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ich") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00edch"))
|
|
|
{ //-ích
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("\u00e9ho") || //-ého
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u011bmi") || //-ěmu
|
|
|
current.ToString().Substring(len - 3, 3).Equals("emi") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00e9mu") || // -ému current.substring( len-3,len).equals("ete")||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("eti") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("iho") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00edho") || //-ího
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00edmi") || //-ími
|
|
|
current.ToString().Substring(len - 3, 3).Equals("imu"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 3, 3).Equals("\u00e1ch") || //-ách
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ata") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("aty") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00fdch") || //-ých
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ama") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ami") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ov\u00e9") || //-ové
|
|
|
current.ToString().Substring(len - 3, 3).Equals("ovi") ||
|
|
|
current.ToString().Substring(len - 3, 3).Equals("\u00fdmi"))
|
|
|
{ //-ými
|
|
|
|
|
|
current = current.Remove(len - 3, 3);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
if (len > 4)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("em"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
palatalise();
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("es") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00e9m") || //-ém
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00edm"))
|
|
|
{ //-ím
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("\u016fm"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 2, 2).Equals("at") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00e1m") || //-ám
|
|
|
current.ToString().Substring(len - 2, 2).Equals("os") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("us") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("\u00fdm") || //-ým
|
|
|
current.ToString().Substring(len - 2, 2).Equals("mi") ||
|
|
|
current.ToString().Substring(len - 2, 2).Equals("ou"))
|
|
|
{
|
|
|
|
|
|
current = current.Remove(len - 2, 2);
|
|
|
return;
|
|
|
}
|
|
|
}//len>4
|
|
|
if (len > 3)
|
|
|
{
|
|
|
if (current.ToString().Substring(len - 1, 1).Equals("e") ||
|
|
|
current.ToString().Substring(len - 1, 1).Equals("i"))
|
|
|
{
|
|
|
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 1, 1).Equals("\u00ed") || //-é
|
|
|
current.ToString().Substring(len - 1, 1).Equals("\u011b"))
|
|
|
{ //-ě
|
|
|
|
|
|
palatalise();
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 1, 1).Equals("u") ||
|
|
|
current.ToString().Substring(len - 1, 1).Equals("y") ||
|
|
|
current.ToString().Substring(len - 1, 1).Equals("\u016f"))
|
|
|
{ //-ů
|
|
|
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
return;
|
|
|
}
|
|
|
if (current.ToString().Substring(len - 1, 1).Equals("a") ||
|
|
|
current.ToString().Substring(len - 1, 1).Equals("o") ||
|
|
|
current.ToString().Substring(len - 1, 1).Equals("\u00e1") || // -á
|
|
|
current.ToString().Substring(len - 1, 1).Equals("\u00e9") || //-é
|
|
|
current.ToString().Substring(len - 1, 1).Equals("\u00fd"))
|
|
|
{ //-ý
|
|
|
|
|
|
current = current.Remove(len - 1, 1);
|
|
|
return;
|
|
|
}
|
|
|
}//len>3
|
|
|
}
|
|
|
}
|
|
|
} |