Еврей Lucene анализатор

Огромная разница.

Как следует из названия, a double имеет в 2 раза большую точность, чем float [1] sup>. В общем случае a double имеет 15 десятичных цифр точности, в то время как float имеет 7.

Вот как рассчитывается количество цифр:

double имеет 52 бита мантиссы + 1 скрытый бит: log (2 53 sup>) ÷ log (10) = 15,95 цифры

float имеет 23 бита мантиссы + 1 скрытый бит: log (2 24 sup>) ÷ log (10) = 7,22 цифры

Эта потеря точности может привести к увеличению ошибок усечения при повторных вычислениях, например

float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
    b += a;
printf("%.7g\n", b); // prints 9.000023

, в то время как

double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
    b += a;
printf("%.15g\n", b); // prints 8.99999999999996

Кроме того, максимальное значение float составляет около 3e38, а double - около 1.7e308, поэтому использование float может поразить «бесконечность» (т.е. специальное число с плавающей точкой) гораздо проще, чем double для чего-то простого, например вычисление факториала 60.

Во время тестирования, возможно, несколько тестовых примеров содержат эти огромные числа, которые могут привести к сбою ваших программ, если вы используете float.


Конечно, иногда даже double недостаточно точен, поэтому у нас иногда есть long double [1] sup> (в приведенном выше примере на Mac 9.0000000000000066), но все Типы с плавающей запятой страдают от ошибок округления , поэтому, если точность очень важна (например, обработка денег), вы должны использовать int или класс дроби.


Кроме того, не используйте += для суммирования большого числа чисел с плавающей запятой, так как ошибки быстро накапливаются. Если вы используете Python, используйте fsum. В противном случае попробуйте реализовать алгоритм суммирования Кахана .


[1]: стандарты C и C ++ не определяют представление float, double и long double. Вполне возможно, что все три реализованы как IEEE двойной точности. Тем не менее, для большинства архитектур (gcc, MSVC; x86, x64, ARM) float действительно действительно число с плавающей запятой IEEE с одинарной точностью (binary32), а double равно число с плавающей точкой двойной точности IEEE (binary64). sup>

29
задан Roey 30 June 2009 в 14:01
поделиться

2 ответа

Обновление
HebMorph

Из любопытства, вызванного вашим вопросом, я связался с Itamar Сын-Хершко, который был активен в списках рассылки Lucene около года назад, когда работал над анализатором иврита для Lucene. Я спросил его, закончил ли он свой анализатор. Вот некоторые важные моменты из его ответа:

Короче говоря, нет, я не сделал. Нет достойных бесплатных / анализатор иврита с открытым исходным кодом для Lucene, это я могу сказать точно. я не уверен, о чем ты предмет, но поверьте мне, когда я говорю нет простого способа сделать это; Это может быть, Люцен не построен для поиска на иврите, но я согласен решение должно быть дано. Конечно, самый безопасный способ индексирования и поиска на иврите тексты - использовать специализированный стеммер, и интеграция с Lucene не является проще всего даже после того, как вы это сделаете. Есть несколько очень хороших решений для поиска на иврите в маркете только один, о котором я знаю, использует Lucene в это ядро; Я недавно пробовал связаться с ними, ответа пока нет ...

Упомянутый коммерческий продукт, основанный на Lucene, называется ATTIVIO, и веб-сайт ATTIVIO утверждает, что поддерживает иврит. В SIGTRS (группа по поиску текста на иврите) была некоторая дискуссия относительно ATTIVIO , в которой утверждается, что он основан на Lucene.

Таким образом, очевидно, можно создать достойный Анализатор на иврите для Lucene, но в настоящее время бесплатный анализатор недоступен.

22
ответ дан 28 November 2019 в 02:06
поделиться

dtsearch имеет плагин для ивритского стемминга под названием "pensim". Похоже, что он разработан компанией "wizcomtech.com".

0
ответ дан 28 November 2019 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: