
Его задача проста: он говорит вам, в каком языке написан какой -то текст. Это очень полезно в качестве шага предварительной обработки для лингвистических данных в приложениях обработки естественного языка, таких как классификация текста и проверка орфографии. Например, другие варианты использования могут включать маршрутизацию электронных писем в нужное географически расположенное отдел обслуживания клиентов на основе языков электронной почты.
Обнаружение языка часто выполняется как часть крупных структур машинного обучения или приложений для обработки естественного языка. В тех случаях, когда вам не нужна полноценная функциональность этих систем или вы не хотите изучать веревки их, небольшая гибкая библиотека пригодится.
Пока что единственная другая комплексная библиотека с открытым исходным кодом в экосистеме GO для этой задачи - Whatlanggo . К сожалению, у него есть два основных недостатка:
Лингю стремится устранить эти проблемы. Ей почти не нужна какая -либо конфигурация, и дает довольно точные результаты как по длинному, так и в коротком тексту, даже на отдельных словах и фразах. Она опирается как на основанных на правилах, так и на статистических методах, но не использует никаких словарей слов. Ей также не нужно подключение к какому -либо внешнему API или службе. Как только библиотека будет загружена, ее можно использовать полностью в автономном режиме.
По сравнению с другими библиотеками обнаружения языка, Lugua сосредоточено на качественном количестве , то есть к тому, чтобы сначала обнаружение для небольшого набора языков, прежде чем добавлять новые. В настоящее время поддерживаются следующие 75 языков:
Lingua может сообщать о статистике точности для некоторых комплексных тестовых данных, доступных для каждого поддерживаемого языка. Тестовые данные для каждого языка разделены на три части:
Как языковые модели, так и данные тестирования были созданы из отдельных документов корпорации Wortschatz, предлагаемых Университетом Лейпцига, Германия. Данные, заполненные различными новостными веб -сайтами, использовались для обучения, каждый корпус включает в себя миллион предложений. Для тестирования использовались корпуса, изготовленные из произвольно выбранных сайтов, каждый из которых содержит десять тысяч предложений. Из каждого тестового корпуса было извлечено случайное несортированное подмножество из 1000 отдельных слов, 1000 слов и 1000 предложений соответственно.
Учитывая сгенерированные данные тестирования, я сравнил результаты обнаружения Lingua и Whatlanggo , работающих по данным поддерживаемых 75 языков Lingua . Кроме того, я добавил Google CLD3 в сравнение с помощью связей GOCLD3. Языки, которые не поддерживаются CLD3 или Whatlanggo, просто игнорируются в процессе обнаружения.
Каждый из следующих разделов содержит два сюжета. График бара показывает подробные результаты точности для каждого поддерживаемого языка. График коробки иллюстрирует распределения значений точности для каждого классификатора. Сами коробки представляют области, в которых находятся средние 50 % данных внутри. В цветных ящиках горизонтальные линии отмечают медиана распределений.
В таблице ниже показана подробная статистика для каждого языка и классификатора, включая среднее, медианное и стандартное отклонение.
| Язык | Средний | Отдельные слова | Пары слов | Предложения | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Лингва (режим высокой точности) | Лингва (режим низкой точности) | CLD3 | ВАЖКАНГ | Лингва (режим высокой точности) | Лингва (режим низкой точности) | CLD3 | ВАЖКАНГ | Лингва (режим высокой точности) | Лингва (режим низкой точности) | CLD3 | ВАЖКАНГ | Лингва (режим высокой точности) | Лингва (режим низкой точности) | CLD3 | ВАЖКАНГ | |
| африкаанс | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| албанский | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| арабский | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| Армянский | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| Азербайджани | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| Баск | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| Белорус | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| Бенгальский | 100 | 100 | 99 | 100 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 |
| Бокмал | 58 | 50 | - | 34 | 39 | 27 | - | 15 | 59 | 47 | - | 28 | 77 | 75 | - | 60 |
| Боснийский | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| болгарский | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| Каталонский | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| китайский | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| хорватский | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| чешский | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| Датский | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| Голландский | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| Английский | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| эсперанто | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| эстонский | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| Финский | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| Французский | 89 | 77 | 55 | 64 | 74 | 52 | 22 | 37 | 94 | 83 | 49 | 59 | 99 | 98 | 94 | 97 |
| Ганда | 91 | 84 | - | - | 79 | 65 | - | - | 95 | 87 | - | - | 100 | 100 | - | - |
| Грузинец | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| немецкий | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| Греческий | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| Гуджарати | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| иврит | 100 | 100 | - | 90 | 100 | 100 | - | 76 | 100 | 100 | - | 94 | 100 | 100 | - | 99 |
| хинди | 73 | 33 | 58 | 52 | 61 | 11 | 34 | 27 | 64 | 20 | 45 | 40 | 95 | 67 | 95 | 88 |
| венгерский | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| исландский | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| индонезийский | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| Ирландский | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| Итальянский | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| Японский | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| Казах | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| корейский | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| латинский | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| Латвиан | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| литовский | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| македонский | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| малайский | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| маори | 91 | 82 | 52 | - | 82 | 62 | 22 | - | 92 | 87 | 43 | - | 99 | 98 | 91 | - |
| Маратхи | 85 | 39 | 84 | 73 | 74 | 16 | 69 | 52 | 85 | 30 | 84 | 74 | 96 | 72 | 98 | 93 |
| Монгольский | 97 | 95 | 83 | - | 93 | 89 | 63 | - | 99 | 98 | 87 | - | 99 | 99 | 99 | - |
| Нинорск | 66 | 52 | - | 34 | 41 | 25 | - | 10 | 66 | 49 | - | 24 | 91 | 81 | - | 69 |
| Персидский | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| Лак | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| португальский | 81 | 69 | 53 | 57 | 59 | 42 | 21 | 26 | 85 | 70 | 40 | 48 | 99 | 95 | 97 | 96 |
| Пенджаби | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| румынский | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| Русский | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| сербский | 88 | 78 | 78 | 57 | 74 | 62 | 63 | 34 | 90 | 80 | 75 | 51 | 99 | 91 | 95 | 86 |
| Шона | 91 | 81 | 76 | 68 | 78 | 56 | 51 | 44 | 96 | 86 | 79 | 65 | 100 | 100 | 99 | 95 |
| словацкий | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| Словен | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| Сомалийский | 92 | 85 | 69 | 68 | 82 | 64 | 38 | 38 | 96 | 90 | 70 | 66 | 100 | 100 | 100 | 99 |
| Сото | 86 | 72 | 49 | - | 67 | 43 | 15 | - | 90 | 75 | 33 | - | 100 | 97 | 98 | - |
| испанский | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| суахили | 81 | 70 | 57 | - | 60 | 43 | 25 | - | 84 | 68 | 49 | - | 98 | 97 | 98 | - |
| Шведский | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| Тагаль | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| Тамильский | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| телугу | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| Тайский | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 99 |
| Цонга | 84 | 72 | - | - | 66 | 46 | - | - | 89 | 73 | - | - | 98 | 97 | - | - |
| Чвана | 84 | 71 | - | - | 65 | 44 | - | - | 88 | 73 | - | - | 99 | 96 | - | - |
| турецкий | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| Украинский | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| Урду | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| вьетнамский | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| валлийский | 91 | 82 | 69 | - | 78 | 61 | 43 | - | 96 | 87 | 66 | - | 99 | 99 | 98 | - |
| Xhosa | 82 | 69 | 66 | - | 64 | 45 | 40 | - | 85 | 67 | 65 | - | 98 | 94 | 92 | - |
| Йоруба | 74 | 62 | 15 | 22 | 50 | 33 | 5 | 11 | 77 | 61 | 11 | 14 | 96 | 92 | 28 | 41 |
| Зулу | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| Иметь в виду | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| Медиана | 89,0 | 80.0 | 68.0 | 62,0 | 74.0 | 57.0 | 41.0 | 38.0 | 94.0 | 81.0 | 66.0 | 57.0 | 99,0 | 97.0 | 98.0 | 94.0 |
| Стандартное отклонение | 13.08 | 17.29 | 19.04 | 20.22 | 18.41 | 24.9 | 27.86 | 29,28 | 13.12 | 18.93 | 21.83 | 24.22 | 11.05 | 11,91 | 13.95 | 11.24 |
Каждый языковой детектор использует вероятностную модель N-Gram, обученную распределению персонажей в некотором учебном корпусе. Большинство библиотек используют только N-граммы размера 3 (триграммы), что является удовлетворительным для обнаружения языка более длинных фрагментов текста, состоящих из нескольких предложений. Однако для коротких фраз или отдельных слов триграмм недостаточно. Чем короче текст ввода, тем меньше n-граммов доступны. Вероятности, оцененные из таких немногих N-граммов, не являются надежными. Вот почему Lingua использует N-граммы размеров 1 до 5, что приводит к гораздо более точному прогнозированию правильного языка.
Второе важное отличие состоит в том, что Lingua использует не только такую статистическую модель, но и двигатель, основанный на правилах. Этот двигатель сначала определяет алфавит входного текста и ищет символы, которые являются уникальными на одном или нескольких языках. Если именно один язык может быть надежно выбран таким образом, статистическая модель больше не нужна. В любом случае, двигатель, основанный на правилах, отображает языки, которые не удовлетворяют условиям входного текста. Только тогда, на втором этапе вероятностная модель N-грамма принимается во внимание. Это имеет смысл, потому что загрузка меньше языковых моделей означает меньше потребления памяти и лучшую производительность времени выполнения.
В целом, всегда является хорошей идеей ограничить набор языков, которые будут учитываться в процессе классификации с использованием соответствующих методов API. Если вы заранее знаете, что определенные языки никогда не возникают во входном тексте, не позволяйте им принимать участие в процессе классификации. Механизм фильтрации двигателя, основанного на правилах, довольно хорош, однако фильтрация, основанная на ваших собственных знаниях о входном тексте, всегда предпочтительнее.
Если вы хотите воспроизвести результаты точности выше, вы можете создать отчеты о тестировании самостоятельно как для классификаторов, так и для всех языков, выполняя:
cd cmd
go run accuracy_reporter.go
Чтобы GOCLD3 успешно работал, вам необходимо установить точную версию 3.17.3 буферов протокола Google, что немного прискорбно. Для каждого детектора и языка файл отчета о тестировании затем записывается в /accuracy-reports . В качестве примера, вот текущий выходной отчет Lingua German:
##### German #####
>>> Accuracy on average: 89.23%
>> Detection of 1000 single words (average length: 9 chars)
Accuracy: 73.90%
Erroneously classified as Dutch: 2.30%, Danish: 2.10%, English: 2.00%, Latin: 1.90%, Bokmal: 1.60%, Basque: 1.20%, French: 1.20%, Italian: 1.20%, Esperanto: 1.10%, Swedish: 1.00%, Afrikaans: 0.80%, Tsonga: 0.70%, Nynorsk: 0.60%, Portuguese: 0.60%, Yoruba: 0.60%, Finnish: 0.50%, Sotho: 0.50%, Welsh: 0.50%, Estonian: 0.40%, Irish: 0.40%, Polish: 0.40%, Spanish: 0.40%, Swahili: 0.40%, Tswana: 0.40%, Bosnian: 0.30%, Icelandic: 0.30%, Tagalog: 0.30%, Albanian: 0.20%, Catalan: 0.20%, Croatian: 0.20%, Indonesian: 0.20%, Lithuanian: 0.20%, Maori: 0.20%, Romanian: 0.20%, Xhosa: 0.20%, Zulu: 0.20%, Latvian: 0.10%, Malay: 0.10%, Slovak: 0.10%, Slovene: 0.10%, Somali: 0.10%, Turkish: 0.10%
>> Detection of 1000 word pairs (average length: 18 chars)
Accuracy: 94.10%
Erroneously classified as Dutch: 0.90%, Latin: 0.80%, English: 0.70%, Swedish: 0.60%, Danish: 0.50%, French: 0.40%, Bokmal: 0.30%, Irish: 0.20%, Tagalog: 0.20%, Afrikaans: 0.10%, Esperanto: 0.10%, Estonian: 0.10%, Finnish: 0.10%, Italian: 0.10%, Maori: 0.10%, Nynorsk: 0.10%, Somali: 0.10%, Swahili: 0.10%, Tsonga: 0.10%, Turkish: 0.10%, Welsh: 0.10%, Zulu: 0.10%
>> Detection of 1000 sentences (average length: 111 chars)
Accuracy: 99.70%
Erroneously classified as Dutch: 0.20%, Latin: 0.10%
go get github.com/pemistahl/lingua-go
Lingua требует хотя бы версии 1.18.
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
Исходный код сопровождается обширным набором для тестирования модуля. Чтобы запустить тесты, просто скажите:
go test
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
if language , exists := detector . DetectLanguageOf ( "languages are awesome" ); exists {
fmt . Println ( language )
}
// Output: English
}По умолчанию Lingua возвращает наиболее вероятный язык для данного входного текста. Тем не менее, есть определенные слова, которые написаны одинаково на более чем на одном языке. Слово пролог , например, является как действительным английским, так и французским словом. Lingua выведет английский или французский, что может быть неправильно в данном контексте. В таких случаях можно определить минимальное относительное расстояние, которое должно удовлетворить логарифмизированные и суммированные вероятности для каждого возможного языка. Это можно указать следующим образом:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
WithMinimumRelativeDistance ( 0.9 ).
Build ()
language , exists := detector . DetectLanguageOf ( "languages are awesome" )
fmt . Println ( language )
fmt . Println ( exists )
// Output:
// Unknown
// false
} Имейте в виду, что расстояние между языковыми вероятностями зависит от длины входного текста. Чем длиннее входной текст, тем больше расстояние между языками. Поэтому, если вы хотите классифицировать очень короткие текстовые фразы, не устанавливайте минимальное относительное расстояние слишком высоким. В противном случае Unknown будет возвращено большую часть времени, как в примере выше. Это возвратная ценность для случаев, когда обнаружение языка невозможна достоверно. Это значение не предназначено для включения в набор языков ввода при создании языкового детектора. Если вы включите его, он будет автоматически удален из набора языков ввода.
Знать о наиболее вероятном языке - это хорошо, но насколько надежна вычисленная вероятность? И насколько менее вероятно, что другие изучаемые языки по сравнению с наиболее вероятным? На эти вопросы можно ответить:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
confidenceValues := detector . ComputeLanguageConfidenceValues ( "languages are awesome" )
for _ , elem := range confidenceValues {
fmt . Printf ( "%s: %.2f n " , elem . Language (), elem . Value ())
}
// Output:
// English: 0.93
// French: 0.04
// German: 0.02
// Spanish: 0.01
} В приведенном выше примере возвращается кусок ConfidenceValue , содержащий все возможные языки, отсортированные по значению доверия в порядке убывания. Каждое значение является вероятностью от 0,0 до 1,0. Вероятности всех языков будут суммироваться до 1,0. Если язык однозначно идентифицируется по двигателю правила, значение 1.0 всегда будет возвращено для этого языка. Другие языки получат значение 0,0.
Существует также метод возврата значения доверия только для одного конкретного языка:
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04Значение, которое вычисляет этот метод, составляет число от 0,0 до 1,0. Если язык однозначно идентифицируется по двигателю правила, значение 1.0 всегда будет возвращено. Если данный язык не поддерживается этим экземпляром детектора, значение 0.0 всегда будет возвращено.
По умолчанию Lingua использует ленивую загрузку для загрузки только тех языковых моделей по требованию, которые считаются актуальными на основе правил фильтрационного двигателя. Например, для веб -сервисов довольно полезно предварительно загружать все языковые модели в память, чтобы избежать неожиданной задержки при ожидании ответа на обслуживание. Если вы хотите включить режим нетерпеливой загрузки, вы можете сделать это так:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () Многочисленные экземпляры LanguageDetector имеют одни и те же языковые модели в памяти, которые доступны асинхронно в результате экземпляров.
Высокая точность обнаружения Lingua достигается за счет того, что он заметно медленнее, чем другие языковые детекторы. Большие языковые модели также потребляют значительные объемы памяти. Эти требования могут быть невозможны для систем, работающих на низких ресурсах. Если вы хотите классифицировать в основном длинные тексты или вам необходимо сохранить ресурсы, вы можете включить режим низкой точности , который загружает лишь небольшое подмножество языковых моделей в память:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()Недостатком этого подхода является то, что точность обнаружения для коротких текстов, состоящих из менее чем 120 символов, значительно упадет. Тем не менее, точность обнаружения для текстов, которые более 120 символов останется в основном незатронутыми.
В режиме высокой точности (по умолчанию) языковой детектор потребляет приблизительно 1800 МБ памяти, если загружаются все языковые модели. В режиме низкой точности потребление памяти уменьшается примерно до 110 МБ. Цель состоит в том, чтобы еще больше сократить потребление памяти в более поздних выпусках.
Альтернативой для меньшего действия памяти и более высокой производительности является уменьшение набора языков при создании языкового детектора. В большинстве случаев не рекомендуется построить детектор из всех поддерживаемых языков. Когда у вас есть знания о текстах, которые вы хотите классифицировать, вы можете почти всегда исключить определенные языки как невозможные или вряд ли произойдут.
В отличие от большинства других языковых детекторов, Lugance может обнаружить несколько языков в смешанных текстах. Эта функция может дать совершенно разумные результаты, но она все еще находится в экспериментальном состоянии, и поэтому результат обнаружения сильно зависит от входного текста. Он работает лучше всего в режиме с высокой точностью с несколькими длинными словами для каждого языка. Чем короче фразы и их слова, тем менее точны результаты. Сокращение набора языков при построении языкового детектора также может повысить точность для этой задачи, если языки, встречающиеся в тексте, равны языкам, поддерживаемым соответствующим экземпляром языкового детектора.
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
sentence := "Parlez-vous français? " +
"Ich spreche Französisch nur ein bisschen. " +
"A little bit is better than nothing."
for _ , result := range detector . DetectMultipleLanguagesOf ( sentence ) {
fmt . Printf ( "%s: '%s' n " , result . Language (), sentence [ result . StartIndex (): result . EndIndex ()])
}
// Output:
// French: 'Parlez-vous français? '
// German: 'Ich spreche Französisch nur ein bisschen. '
// English: 'A little bit is better than nothing.'
} В приведенном выше примере возвращается кусок DetectionResult . Каждая запись в срезе описывает смежный раздел текста с одним языком, обеспечивая начальные и конечные показатели соответствующей подстроки.
Могут быть задачи классификации, где вы заранее знаете, что ваши языковые данные определенно не написаны на латыни, например. Точность обнаружения может стать лучше в таких случаях, если вы исключите определенные языки из процесса принятия решения или явно включают соответствующие языки:
// Include all languages available in the library.
lingua . NewLanguageDetectorBuilder (). FromAllLanguages ()
// Include only languages that are not yet extinct (= currently excludes Latin).
lingua . NewLanguageDetectorBuilder (). FromAllSpokenLanguages ()
// Include only languages written with Cyrillic script.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithCyrillicScript ()
// Exclude only the Spanish language from the decision algorithm.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithout ( lingua . Spanish )
// Only decide between English and German.
lingua . NewLanguageDetectorBuilder (). FromLanguages ( lingua . English , lingua . German )
// Select languages by ISO 639-1 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_1 ( lingua . EN , lingua . DE )
// Select languages by ISO 639-3 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_3 ( lingua . ENG , lingua . DEU )Взгляните на запланированные проблемы.
Любой вклад в Lingua очень ценится. Пожалуйста, прочитайте инструкции в CONTRIBUTING.md о том, как добавить новые языки в библиотеку.