javascript + динамическое удаление диакритического текста на арабском языке - PullRequest
8 голосов
/ 07 марта 2011

как динамически удалять арабский диакритический знак Я разрабатываю электронную книгу "chm", и на нескольких html-страницах содержится арабский текст, но иногда поисковая система хочет выделить некоторые арабские слова, потому что их диакритический знак можно использовать при загрузке страницыФункции JavaScript, которые убрали бы диакритический текст на арабском языке?но должен иметь опцию, чтобы включить снова, так что я не хочу удалять его из HTML физически, но временно,

дело в том, что я не знаю, с чего начать и как правильно использовать функцию

спасибо:)

Например

Text : الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ
converted to : الحمد لله رب العالمين 

Ответы [ 5 ]

6 голосов
/ 25 августа 2011

Попробуйте это

Text : الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ
converted to : الحمد لله رب العالمين 

http://www.suhailkaleem.com/2009/08/26/remove-diacritics-from-arabic-text-quran/

Код C # не Javascript, хотя. Все еще пытаюсь понять, как этого добиться в javascript

РЕДАКТИРОВАТЬ: Очевидно, это очень легко в JavaScript. Diacratics хранятся в виде отдельных «букв», и их можно легко удалить.

var CHARCODE_SHADDA = 1617;
var CHARCODE_SUKOON = 1618;
var CHARCODE_SUPERSCRIPT_ALIF = 1648;
var CHARCODE_TATWEEL = 1600;
var CHARCODE_ALIF = 1575;

function isCharTashkeel(letter)
{
    if (typeof(letter) == "undefined" || letter == null)
        return false;

    var code = letter.charCodeAt(0);
    //1648 - superscript alif
    //1619 - madd: ~
    return (code == CHARCODE_TATWEEL || code == CHARCODE_SUPERSCRIPT_ALIF || code >= 1612 && code <= 1631); //tashkeel
}

function stripTashkeel(input)
{
  var output = "";
  //todo consider using a stringbuilder to improve performance
  for (var i = 0; i < input.length; i++)
  {
    var letter = input.charAt(i);
    if (!isCharTashkeel(letter)) //tashkeel
      output += letter;                                
  }


return output;                   
}

Редактировать: вот еще один способ сделать это, используя BuckData http://qurandev.github.com/

Преимущества Бак использует меньше пропускной способности В Javascript вы можете искать через весь Бак Коран текст в 1 выстрел. интуитивно понятный по сравнению с арабским поиском Бак на арабский и арабский на Бак это простой вызов js. Играть с живым образец здесь: http://jsfiddle.net/BrxJP/ Вы можете удалить все гласные из Бака текст в несколько миллисекунд. Зачем это делать? ты можешь искать в javascript, игнорируя различия в заданиях (Fathah, Dammah, Kasrah). Что приводит к большему количеству хитов. Текст Regex + бак может привести к потрясающие оптимизации. Все поиски могут быть выполнены локально. http://qurandev.appspot.com Как генерируются данные? только один к одному отображение с использованием: http://corpus.quran.com/java/buckwalter.jsp

2 голосов
/ 04 декабря 2016

Я написал эту функцию, которая обрабатывает строки со смешанными арабскими и английскими символами, удаляя специальные символы (включая диакритические знаки) и нормализуя некоторые арабские символы, такие как преобразование всех символов в into.

normalize_text = function(text) {

  //remove special characters
  text = text.replace(/([^\u0621-\u063A\u0641-\u064A\u0660-\u0669a-zA-Z 0-9])/g, '');

  //normalize Arabic
  text = text.replace(/(آ|إ|أ)/g, 'ا');
  text = text.replace(/(ة)/g, 'ه');
  text = text.replace(/(ئ|ؤ)/g, 'ء')
  text = text.replace(/(ى)/g, 'ي');

  //convert arabic numerals to english counterparts.
  var starter = 0x660;
  for (var i = 0; i < 10; i++) {
    text.replace(String.fromCharCode(starter + i), String.fromCharCode(48 + i));
  }

  return text;
}
<input value="الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ" type="text" id="input">
<button onclick="document.getElementById('input').value = normalize_text(document.getElementById('input').value)">Normalize</button>
1 голос
/ 25 февраля 2017

Используйте это регулярное выражение, чтобы поймать всех ташкилей

[ؐ-ًؚٟ]

1 голос
/ 24 октября 2016

Вот код javascript, который может почти все время обрабатывать удаление диакритических знаков.

var arabicNormChar = {
    'ك': 'ک', 'ﻷ': 'لا', 'ؤ': 'و', 'ى': 'ی', 'ي': 'ی', 'ئ': 'ی', 'أ': 'ا', 'إ': 'ا', 'آ': 'ا', 'ٱ': 'ا', 'ٳ': 'ا', 'ة': 'ه', 'ء': '', 'ِ': '', 'ْ': '', 'ُ': '', 'َ': '', 'ّ': '', 'ٍ': '', 'ً': '', 'ٌ': '', 'ٓ': '', 'ٰ': '', 'ٔ': '', '�': ''
}

var simplifyArabic  = function (str) {
    return str.replace(/[^\u0000-\u007E]/g, function(a){ 
        var retval = arabicNormChar[a]
        if (retval == undefined) {retval = a}
        return retval; 
    }).normalize('NFKD').toLowerCase();
}

//now you can use simplifyArabic(str) on Arabic strings to remove the diacritics

Примечание: вы можете переопределить arabicNormChar в соответствии со своими предпочтениями.

0 голосов
/ 07 марта 2011

На этом сайте есть несколько процедур для нормализации Javascript Unicode, которые можно использовать для выполнения ваших попыток. Если ничего другого, это может обеспечить хорошую отправную точку.

Если вы можете предварительно обработать данные, в Python есть хорошие подпрограммы Unicode, чтобы упростить работу с такого рода преобразованиями. Это может быть хорошим вариантом, если вы можете предварительно обработать файл CHM для создания отдельного индексного файла, который затем может быть объединен с вашим CHM:

import unicodedata

def _strip(text):
    return ''.join([c for c in unicodedata.normalize('NFD', text) \
        if unicodedata.category(c) != 'Mn'])

composed = u'\xcd\xf1\u0163\u0115\u0155\u0148\u0101\u0163\u0129\u014d' \
    u'\u0146\u0105\u013c\u012d\u017e\u0119'

_strip(composed)
'Internationalize'
...