예제 #1
0
func removeSuffix(input []rune) []rune {

	inputLen := len(input)

	if inputLen > 4 && analysis.RunesEndsWith(input, "es") {
		switch input[inputLen-3] {
		case 'r', 's', 'l', 'z':
			return input[0 : inputLen-2]
		}
	}

	if inputLen > 3 && analysis.RunesEndsWith(input, "ns") {
		input[inputLen-2] = 'm'
		return input[0 : inputLen-1]
	}

	if inputLen > 4 && (analysis.RunesEndsWith(input, "eis") || analysis.RunesEndsWith(input, "éis")) {
		input[inputLen-3] = 'e'
		input[inputLen-2] = 'l'
		return input[0 : inputLen-1]
	}

	if inputLen > 4 && analysis.RunesEndsWith(input, "ais") {
		input[inputLen-2] = 'l'
		return input[0 : inputLen-1]
	}

	if inputLen > 4 && analysis.RunesEndsWith(input, "óis") {
		input[inputLen-3] = 'o'
		input[inputLen-2] = 'l'
		return input[0 : inputLen-1]
	}

	if inputLen > 4 && analysis.RunesEndsWith(input, "is") {
		input[inputLen-1] = 'l'
		return input
	}

	if inputLen > 3 &&
		(analysis.RunesEndsWith(input, "ões") ||
			analysis.RunesEndsWith(input, "ães")) {
		input = input[0 : inputLen-1]
		inputLen = len(input)
		input[inputLen-2] = 'ã'
		input[inputLen-1] = 'o'
		return input
	}

	if inputLen > 6 && analysis.RunesEndsWith(input, "mente") {
		return input[0 : inputLen-5]
	}

	if inputLen > 3 && input[inputLen-1] == 's' {
		return input[0 : inputLen-1]
	}
	return input
}
예제 #2
0
func norm(input []rune) []rune {

	inputLen := len(input)
	if inputLen > 4 {
		for i := 0; i < inputLen; i++ {
			switch input[i] {
			case 'à', 'á', 'â':
				input[i] = 'a'
			case 'ô':
				input[i] = 'o'
			case 'è', 'é', 'ê':
				input[i] = 'e'
			case 'ù', 'û':
				input[i] = 'u'
			case 'î':
				input[i] = 'i'
			case 'ç':
				input[i] = 'c'
			}

			ch := input[0]
			for i := 1; i < inputLen; i++ {
				if input[i] == ch && unicode.IsLetter(ch) {
					input = analysis.DeleteRune(input, i)
					i -= 1
					inputLen = len(input)
				} else {
					ch = input[i]
				}
			}
		}
	}

	if inputLen > 4 && analysis.RunesEndsWith(input, "ie") {
		input = input[0 : inputLen-2]
		inputLen = len(input)
	}

	if inputLen > 4 {
		if input[inputLen-1] == 'r' {
			input = input[0 : inputLen-1]
			inputLen = len(input)
		}
		if input[inputLen-1] == 'e' {
			input = input[0 : inputLen-1]
			inputLen = len(input)
		}
		if input[inputLen-1] == 'e' {
			input = input[0 : inputLen-1]
			inputLen = len(input)
		}
		if input[inputLen-1] == input[inputLen-2] && unicode.IsLetter(input[inputLen-1]) {
			input = input[0 : inputLen-1]
			inputLen = len(input)
		}
	}

	return input
}
예제 #3
0
func normFeminine(input []rune) []rune {
	inputLen := len(input)

	if inputLen > 7 &&
		(analysis.RunesEndsWith(input, "inha") ||
			analysis.RunesEndsWith(input, "iaca") ||
			analysis.RunesEndsWith(input, "eira")) {
		input[inputLen-1] = 'o'
		return input
	}

	if inputLen > 6 {
		if analysis.RunesEndsWith(input, "osa") ||
			analysis.RunesEndsWith(input, "ica") ||
			analysis.RunesEndsWith(input, "ida") ||
			analysis.RunesEndsWith(input, "ada") ||
			analysis.RunesEndsWith(input, "iva") ||
			analysis.RunesEndsWith(input, "ama") {
			input[inputLen-1] = 'o'
			return input
		}

		if analysis.RunesEndsWith(input, "ona") {
			input[inputLen-3] = 'ã'
			input[inputLen-2] = 'o'
			return input[0 : inputLen-1]
		}

		if analysis.RunesEndsWith(input, "ora") {
			return input[0 : inputLen-1]
		}

		if analysis.RunesEndsWith(input, "esa") {
			input[inputLen-3] = 'ê'
			return input[0 : inputLen-1]
		}

		if analysis.RunesEndsWith(input, "na") {
			input[inputLen-1] = 'o'
			return input
		}
	}
	return input
}
예제 #4
0
func stem(input []rune) []rune {

	inputLen := len(input)

	if inputLen > 5 && input[inputLen-1] == 'x' {
		if input[inputLen-3] == 'a' && input[inputLen-2] == 'u' && input[inputLen-4] != 'e' {
			input[inputLen-2] = 'l'
		}
		input = input[0 : inputLen-1]
		inputLen = len(input)
	}

	if inputLen > 3 && input[inputLen-1] == 'x' {
		input = input[0 : inputLen-1]
		inputLen = len(input)
	}

	if inputLen > 3 && input[inputLen-1] == 's' {
		input = input[0 : inputLen-1]
		inputLen = len(input)
	}

	if inputLen > 9 && analysis.RunesEndsWith(input, "issement") {
		input = input[0 : inputLen-6]
		inputLen = len(input)
		input[inputLen-1] = 'r'
		return norm(input)
	}

	if inputLen > 8 && analysis.RunesEndsWith(input, "issant") {
		input = input[0 : inputLen-4]
		inputLen = len(input)
		input[inputLen-1] = 'r'
		return norm(input)
	}

	if inputLen > 6 && analysis.RunesEndsWith(input, "ement") {
		input = input[0 : inputLen-4]
		inputLen = len(input)
		if inputLen > 3 && analysis.RunesEndsWith(input, "ive") {
			input = input[0 : inputLen-1]
			inputLen = len(input)
			input[inputLen-1] = 'f'
		}
		return norm(input)
	}

	if inputLen > 11 && analysis.RunesEndsWith(input, "ficatrice") {
		input = input[0 : inputLen-5]
		inputLen = len(input)
		input[inputLen-2] = 'e'
		input[inputLen-1] = 'r'
		return norm(input)
	}

	if inputLen > 10 && analysis.RunesEndsWith(input, "ficateur") {
		input = input[0 : inputLen-4]
		inputLen = len(input)
		input[inputLen-2] = 'e'
		input[inputLen-1] = 'r'
		return norm(input)
	}

	if inputLen > 9 && analysis.RunesEndsWith(input, "catrice") {
		input = input[0 : inputLen-3]
		inputLen = len(input)
		input[inputLen-4] = 'q'
		input[inputLen-3] = 'u'
		input[inputLen-2] = 'e'
		//s[len-1] = 'r' <-- unnecessary, already 'r'.
		return norm(input)
	}

	if inputLen > 8 && analysis.RunesEndsWith(input, "cateur") {
		input = input[0 : inputLen-2]
		inputLen = len(input)
		input[inputLen-4] = 'q'
		input[inputLen-3] = 'u'
		input[inputLen-2] = 'e'
		input[inputLen-1] = 'r'
		return norm(input)
	}

	if inputLen > 8 && analysis.RunesEndsWith(input, "atrice") {
		input = input[0 : inputLen-4]
		inputLen = len(input)
		input[inputLen-2] = 'e'
		input[inputLen-1] = 'r'
		return norm(input)
	}

	if inputLen > 7 && analysis.RunesEndsWith(input, "ateur") {
		input = input[0 : inputLen-3]
		inputLen = len(input)
		input[inputLen-2] = 'e'
		input[inputLen-1] = 'r'
		return norm(input)
	}

	if inputLen > 6 && analysis.RunesEndsWith(input, "trice") {
		input = input[0 : inputLen-1]
		inputLen = len(input)
		input[inputLen-3] = 'e'
		input[inputLen-2] = 'u'
		input[inputLen-1] = 'r'
	}

	if inputLen > 5 && analysis.RunesEndsWith(input, "ième") {
		return norm(input[0 : inputLen-4])
	}

	if inputLen > 7 && analysis.RunesEndsWith(input, "teuse") {
		input = input[0 : inputLen-2]
		inputLen = len(input)
		input[inputLen-1] = 'r'
		return norm(input)
	}

	if inputLen > 6 && analysis.RunesEndsWith(input, "teur") {
		input = input[0 : inputLen-1]
		inputLen = len(input)
		input[inputLen-1] = 'r'
		return norm(input)
	}

	if inputLen > 5 && analysis.RunesEndsWith(input, "euse") {
		return norm(input[0 : inputLen-2])
	}

	if inputLen > 8 && analysis.RunesEndsWith(input, "ère") {
		input = input[0 : inputLen-1]
		inputLen = len(input)
		input[inputLen-2] = 'e'
		return norm(input)
	}

	if inputLen > 7 && analysis.RunesEndsWith(input, "ive") {
		input = input[0 : inputLen-1]
		inputLen = len(input)
		input[inputLen-1] = 'f'
		return norm(input)
	}

	if inputLen > 4 &&
		(analysis.RunesEndsWith(input, "folle") ||
			analysis.RunesEndsWith(input, "molle")) {
		input = input[0 : inputLen-2]
		inputLen = len(input)
		input[inputLen-1] = 'u'
		return norm(input)
	}

	if inputLen > 9 && analysis.RunesEndsWith(input, "nnelle") {
		return norm(input[0 : inputLen-5])
	}

	if inputLen > 9 && analysis.RunesEndsWith(input, "nnel") {
		return norm(input[0 : inputLen-3])
	}

	if inputLen > 4 && analysis.RunesEndsWith(input, "ète") {
		input = input[0 : inputLen-1]
		inputLen = len(input)
		input[inputLen-2] = 'e'
	}

	if inputLen > 8 && analysis.RunesEndsWith(input, "ique") {
		input = input[0 : inputLen-4]
		inputLen = len(input)
	}

	if inputLen > 8 && analysis.RunesEndsWith(input, "esse") {
		return norm(input[0 : inputLen-3])
	}

	if inputLen > 7 && analysis.RunesEndsWith(input, "inage") {
		return norm(input[0 : inputLen-3])
	}

	if inputLen > 9 && analysis.RunesEndsWith(input, "isation") {
		input = input[0 : inputLen-7]
		inputLen = len(input)
		if inputLen > 5 && analysis.RunesEndsWith(input, "ual") {
			input[inputLen-2] = 'e'
		}
		return norm(input)
	}

	if inputLen > 9 && analysis.RunesEndsWith(input, "isateur") {
		return norm(input[0 : inputLen-7])
	}

	if inputLen > 8 && analysis.RunesEndsWith(input, "ation") {
		return norm(input[0 : inputLen-5])
	}

	if inputLen > 8 && analysis.RunesEndsWith(input, "ition") {
		return norm(input[0 : inputLen-5])
	}

	return norm(input)

}