正規表現を使用して、多言語文字列を単言語トークンに分割したいと考えています。
たとえば、この英語-アラビア語の文字列の場合:
「彼の名前は محمد で、彼の母親の名前は آمنه でした。」
結果は次のようになります。
- '彼の名前は '
- 「むかし」
- 'そして彼の母親の名前は'
- 「そうです。」
完璧ではありません (実際の例で試して、適合するかどうかを確認する必要があります)。
splitArray = Regex.Split(subjectString,
@"(?<=\p{IsArabic}) # (if the previous character is Arabic)
[\p{Zs}\p{P}]+ # split on whitespace/punctuation
(?=\p{IsBasicLatin}) # (if the following character is Latin)
| # or
(?<=\p{IsBasicLatin}) # vice versa
[\s\p{P}]+
(?=\p{IsArabic})",
RegexOptions.IgnorePatternWhitespace);
これは、前の文字がアラビア語ブロックからのもので、次の文字が基本ラテン ブロックからのものである場合 (またはその逆)、空白/句読点で分割されます。
System.Text.RegularExpressions.Regex regx = new System.Text.RegularExpressions.Regex(@"([\s\(\:]*[a-zA-Z]+[\s\)\:]*)+");
var matchs = regx.Matches(input).Cast<System.Text.RegularExpressions.Match>().ToList();