/
speech.go
131 lines (108 loc) · 2.61 KB
/
speech.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package speech
import (
"errors"
"fmt"
"regexp"
"strings"
"unicode"
)
const (
Shadda = string(rune(0x0651))
Sukoon = string(rune(0x0652))
Damma = string(rune(0x064F))
Fatha = string(rune(0x064E))
Kasra = string(rune(0x0650))
Dammatan = string(rune(0x064C))
Fathatan = string(rune(0x064B))
Kasratan = string(rune(0x064D))
Placeholder = string(rune(0x25CC))
SuperscriptAlef = string(rune(0x670))
)
var GrammaticalTags = []string{
"اسم مرفوع",
"اسم منصوب",
"اسم مجرور",
" فعل مرفوع",
"فعل منصوب",
"فعل مجزوم",
"مبني",
"توابع",
"مضارع مرفوع",
"مضارع منصوب بحرف النصب",
"مضارع مجزوم بحرف الجزم",
"مضارع مجزوم بأداة الشرط الجازم",
"مبتدأ",
"خبر ",
"فاعل نائب",
"فاعل",
"اسم كان وأخواتها",
"خبر إن وأخواتها",
"مفعول به",
"مفعول به ثان",
"مفعول به ثالث",
"مفعول فيه",
"مفعول مطلق",
"مفعول لأجله ",
"مفعول معه ",
"حال ",
"تمييز ",
"مستثنى ",
"حصر ",
"منادى",
" اسم وخبر ظن وأخواتها ",
"إسم وخبر حرف نفي",
"اسم إن وأخواتها",
" خبر كان واخواتها",
"إسم مجرور",
"مضاف إليه",
"نعت",
"إسم معطوف",
"توكيد",
"بدل",
}
func IsWhitespace(letter rune) bool {
return letter == ' '
}
func IsWordPunctuation(word string) bool {
for _, l := range word {
if IsPunctuation(l) {
return true
}
}
return false
}
var Punctuation = regexp.MustCompile("[\\.:«»،\"—]")
func IsPunctuation(letter rune) bool {
return Punctuation.MatchString(string(letter))
}
// isArabicLetter does not include tashkeel
func IsArabicLetter(letter rune) bool {
if letter >= 0x0621 && letter <= 0x063A {
return true
}
if letter >= 0x0641 && letter <= 0x064A {
return true
}
return false
}
func IsVowel(letter rune) bool {
sl := string(letter)
return sl == Sukoon || sl == Damma || sl == Fatha || sl == Kasra ||
sl == Dammatan || sl == Fathatan || sl == Kasratan
}
func IsShadda(letter rune) bool {
return string(letter) == Shadda
}
func CleanContent(content string) (string, error) {
for _, c := range content {
if !(IsArabicLetter(c) || IsWhitespace(c) || IsPunctuation(c)) {
return "", errors.New(fmt.Sprintf("%v is an invalid letter", c))
}
}
// Remove double spaces
r, _ := regexp.Compile(" +")
content = r.ReplaceAllString(content, " ")
// Trim sentence
content = strings.TrimFunc(content, unicode.IsSpace)
return content, nil
}