Java 如何确定字符串是英语还是阿拉伯语?
有没有办法确定字符串是英语还是阿拉伯语?您可以使用基于N-gram的文本分类(谷歌搜索该短语),但这不是一种防故障技术,可能需要一个不太短的字符串Java 如何确定字符串是英语还是阿拉伯语?,java,Java,有没有办法确定字符串是英语还是阿拉伯语?您可以使用基于N-gram的文本分类(谷歌搜索该短语),但这不是一种防故障技术,可能需要一个不太短的字符串 您可能还认为只有ASCII字母的字符串不是阿拉伯语。您通常可以通过字符串本身的代码点来判断。阿拉伯语占据Unicode代码空间 这是一个相当安全的赌注,如果这些块中存在相当大比例的字符(如 public static boolean isProbablyArabic(String s) { for (int i = 0; i < s
您可能还认为只有ASCII字母的字符串不是阿拉伯语。您通常可以通过字符串本身的代码点来判断。阿拉伯语占据Unicode代码空间
这是一个相当安全的赌注,如果这些块中存在相当大比例的字符(如
public static boolean isProbablyArabic(String s) {
for (int i = 0; i < s.length();) {
int c = s.codePointAt(i);
if (c >= 0x0600 && c <= 0x06E0)
return true;
i += Character.charCount(c);
}
return false;
}
public静态布尔值isProbablyArabic(字符串s){
对于(int i=0;i=0x0600&&c请尝试以下操作:
internal static bool ContainsArabicLetters(string text)
{
foreach (char character in text.ToCharArray())
{
if (character >= 0x600 && character <= 0x6ff)
return true;
if (character >= 0x750 && character <= 0x77f)
return true;
if (character >= 0xfb50 && character <= 0xfc3f)
return true;
if (character >= 0xfe70 && character <= 0xfefc)
return true;
}
return false;
}
内部静态bool包含两个字母(字符串文本)
{
foreach(text.ToCharArray()中的字符)
{
如果(字符>=0x600&&character=0x750&&character=0xfb50&&character=0xfe70&&character进行了细微更改,以覆盖所有阿拉伯字符和符号范围
private boolean isArabic(String text){
String textWithoutSpace = text.trim().replaceAll(" ",""); //to ignore whitepace
for (int i = 0; i < textWithoutSpace.length();) {
int c = textWithoutSpace.codePointAt(i);
//range of arabic chars/symbols is from 0x0600 to 0x06ff
//the arabic letter 'لا' is special case having the range from 0xFE70 to 0xFEFF
if (c >= 0x0600 && c <=0x06FF || (c >= 0xFE70 && c<=0xFEFF))
i += Character.charCount(c);
else
return false;
}
return true;
}
private boolean isArabic(字符串文本){
String textWithoutSpace=text.trim().replaceAll(“,”);//忽略空白
对于(int i=0;i 如果(c>=0x0600&&c=0xFE70&&cJava本身支持unicode的各种语言检查,那么也支持阿拉伯语。更简单、最小的方法是使用unicode块
public static boolean textContainsArabic(String text) {
for (char charac : text.toCharArray()) {
if (Character.UnicodeBlock.of(charac) == Character.UnicodeBlock.ARABIC) {
return true;
}
}
return false;
}
英文字符通常位于以下4个Unicode块中:
- 基础拉丁语
- 拉丁语补遗
- 拉丁语扩展
- 通用标点符号
public static boolean isEnglish(String text) {
boolean onlyEnglish = false;
for (char character : text.toCharArray()) {
if (Character.UnicodeBlock.of(character) == Character.UnicodeBlock.BASIC_LATIN
|| Character.UnicodeBlock.of(character) == Character.UnicodeBlock.LATIN_1_SUPPLEMENT
|| Character.UnicodeBlock.of(character) == Character.UnicodeBlock.LATIN_EXTENDED_A
|| Character.UnicodeBlock.of(character) == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
onlyEnglish = true;
} else {
onlyEnglish = false;
}
}
return onlyEnglish;
}
有点正确。但当我们将波斯语和英语字母组合在一起时,它返回TRUE!,这是不正确的。
在这里,我修改了相同的方法,使其工作良好
public static boolean isProbablyArabic(String s) {
for (int i = 0; i < s.length();) {
int c = s.codePointAt(i);
if (!(c >= 0x0600 && c <= 0x06E0))
return false;
i += Character.charCount(c);
}
return true;
}
public静态布尔值isProbablyArabic(字符串s){
对于(int i=0;i 如果从当今世界的角度来看,(!(c>=0x0600&&c),我想,“1234”是两个字吗?@Nishant,阿拉伯语是使用正则数还是Rumi?你的意思是它是包含英语还是阿拉伯语文本,还是以这种方式编码?第二种情况应该很简单,因为字符不在相同的Unicode范围内(请参阅:)。你不能以确定的方式来做这件事。所有信息都必须说明它是什么。这就是编码等的原因。但你可能会猜。你应该提供一个非常简短的Java演示来说明你的想法。否则,我认为这是最好的方法(英语与阿拉伯语)。它还需要大量的培训数据(更不用说训练时间了)。您可能还想检查其他阿拉伯语范围-请参阅我答案中的链接。此方法对于大型字符串非常低效,因为它会在每次迭代中计算字符串的长度。Character.codePointCount(s,0,s.length())应该首先分配给一个变量,这样它就不会在每次迭代中调用此函数。@jazib:实际上,更大的问题是对代码点的迭代,这是不正确的。只是解决了它。在我的情况下,您的代码是不可编译的,除非我用Character.UnicodeBlock.ARABIC替换Character.UnicodeBlock.ARABIC,请注意您的方法名是错误的isTextContainsHindi它应该是isTextContainsArabic@GuaravTyagi@Jeeva为了检查英语,英语字符通常在以下4个Unicode块中:基本拉丁语、拉丁语1补充、拉丁语扩展、通用标点符号