Я использую термин «лексическая кодировка» из-за отсутствия лучшего.
Слово, возможно, является основной единицей коммуникации в отличие от письма. Unicode пытается присвоить числовое значение каждой букве всех известных алфавитов. Буква для одного языка является символом для другого. В настоящее время Unicode 5.1 присваивает этим глифам более 100 000 значений. Говорят, что из примерно 180 000 слов, используемых в современном английском языке, имея словарный запас около 2 000 слов, вы должны уметь разговаривать в общих чертах. «Лексическая кодировка» кодирует каждое слово, а не каждую букву, и инкапсулирует их в предложение.
// An simplified example of a "Lexical Encoding"
String sentence = "How are you today?";
int[] sentence = { 93, 22, 14, 330, QUERY };
В этом примере каждый токен в строке был закодирован как целое число. Схема кодирования здесь просто присвоила значение int на основе обобщенного статистического ранжирования использования слов и присвоила константу вопросительному знаку.
В конечном счете, Слово имеет и Правописание, и Значение. Любая «лексическая кодировка» сохранит значение и намерение предложения в целом, а не зависит от языка. Английское предложение будет закодировано в «... нейтральные к языку атомарные элементы значения ...», которое затем может быть преобразовано в любой язык со структурированной синтаксической формой и грамматической структурой.
Какие еще примеры методов «лексического кодирования»?
Если вас интересовало, откуда берется статистика использования слова:
http://www.wordcount.org
Не забывайте, что порядок слов в разных языках различается; в некоторых языках отсутствуют различные особенности английского языка (например, «статьи» - a, an, the - не существуют, AFAIK, на японском языке). В начале 20 века люди использовали кодовые книги для телеграфирования более сложных фраз с использованием кодирования (поскольку телеграммы оплачивались по слову). Одно слово может означать целую фразу или даже предложение ... См. Обсуждение Кана "Взломщики кодов" (amazon.com/…).





Этот вопрос затрагивает лингвистику больше, чем программирование, но для языков, которые являются в высшей степени синтетическими (в которых слова состоят из нескольких комбинированных морфем), попытка «пронумеровать» все возможные слова может быть очень сложной задачей, в отличие от таких языков, как Английский, по крайней мере, несколько изолирующий, или языки, подобные китайскому, которые обладают высокой аналитичностью.
То есть слова не могут быть легко разбиты и подсчитаны на основе составляющих их глифов в некоторых языках.
Эта статья в Википедии о Изолирующие языки может быть полезна для объяснения проблемы.
Достаточно легко придумать для себя. Превратите каждое слово в канонический поток байтов (скажем, разложенный в нижнем регистре UCS32), а затем выполните хеширование до целого числа. 32 бита, вероятно, было бы достаточно, но если не то 64 бита, конечно.
Прежде чем вы решите дать вам язвительный ответ, учтите, что цель Unicode - просто присвоить каждому глифу уникальный идентификатор. Не для того, чтобы ранжировать, отсортировать или сгруппировать их, а просто сопоставить каждому из них уникальный идентификатор, с которым все согласны.
Как система будет обрабатывать множественное число существительных или спряжение глаголов? Будет ли каждый из них иметь собственное значение «Unicode»?
Что касается схемы переводов, это, вероятно, не сработает без дополнительной работы. Вы хотите думать, что можете присвоить каждому слову номер, а затем автоматически перевести его на другой язык. На самом деле, у языков есть проблема, связанная с тем, что несколько слов пишутся одинаково: «ветер развевает волосы назад» и «заводит ваши часы».
Для передачи текста, где у вас, предположительно, будет алфавит для каждого языка, он будет работать нормально, хотя мне интересно, что вы получите от этого, в отличие от использования словаря переменной длины, как в случае с ZIP.
У них есть несколько основных проблем с этой идеей. В большинстве языков значение слова и слово, связанное со значением, меняются очень быстро.
Как только слово будет иметь номер, значение слова изменится. Например, слово «гей» раньше означало только «счастливый» или «веселый», но теперь оно используется в основном для обозначения гомосексуалистов. Другой пример - морфема «спасибо», которая изначально произошла от немецкого «danke», что означает всего лишь одно слово. Еще один пример - «До свидания», что является сокращением «Да благословит тебя Бог».
Другая проблема заключается в том, что даже если кто-то сделает снимок слова в любой момент времени, значение и использование слова будут предметом споров даже в пределах одной и той же провинции. Когда пишутся словари, ученые нередко спорят по поводу одного слова.
Короче говоря, вы не сможете сделать это с существующим языком. Вам следует подумать о том, чтобы изобрести собственный язык для этой цели или использовать достаточно статичный язык, который уже был изобретен, например интерлингва или эсперанто. Однако даже они не были бы идеальными для определения статических морфем в постоянно стандартном лексиконе.
Даже в китайском, где есть приблизительное сопоставление символа со значением, это все равно не сработает. Многие символы меняют свое значение в зависимости от контекста, а также от того, какие символы предшествуют им или добавляются после них.
Проблема усугубляется, когда вы пытаетесь переводить с одного языка на другой. В английском языке может быть одно слово, которое может использоваться в разных случаях, но не может использоваться напрямую в другом языке. Пример этого - «бесплатно». В испанском языке можно использовать либо «libre», что означает «свободный», как в речи, либо «gratis», означающее «бесплатно», как в пиве (и использование неправильного слова вместо «бесплатно» выглядело бы очень забавно).
Есть и другие слова, которые еще сложнее определить, например, слово «красивый» по-корейски; при назывании девушки красивой было бы несколько кандидатов на замену; но когда вы называете еду красивой, если вы не имеете в виду, что еда красивая, есть несколько других кандидатов, которые совершенно разные.
Все сводится к тому, что хотя мы используем только около 200 тысяч слов на английском языке, наш словарный запас в некоторых аспектах на самом деле больше, потому что мы приписываем одному и тому же слову много разных значений. Те же проблемы применимы к эсперанто и интерлингва, а также к любому другому языку, имеющему значение для разговора. Человеческая речь не является четко определенной, хорошо смазанной машиной. Итак, хотя вы могли бы создать такой лексикон, в котором каждое «слово» имело бы свое собственное уникальное значение, было бы очень сложно и почти невозможно для машин, использующих современные методы, перевести с любого человеческого языка в ваш специальный стандартизированный лексикон.
Вот почему машинный перевод по-прежнему отстой, и еще долго будет. Если вы можете добиться большего (а я надеюсь, что сможете), вам, вероятно, следует подумать о том, чтобы сделать это с помощью какой-то стипендии и / или университетского / государственного финансирования, работая над докторской степенью; или просто заработать кучу денег, что бы ни держало ваш корабль в плавании.
На самом деле вам нужно всего около 600 слов на половину приличного словарного запаса.
Это интересный вопрос, но я подозреваю, что вы задаете его не по тем причинам. Думаете ли вы об этом «лексическом« Юникоде »как о чем-то, что позволило бы вам разбивать предложения на не зависящие от языка атомарные элементы значения, а затем восстанавливать их на каком-то другом конкретном языке? Может быть, как средство создания универсального переводчика?
Даже если вы можете закодировать и сохранить, скажем, английское предложение с использованием «лексического юникода», вы не можете ожидать, что прочитаете его и волшебным образом передадите его, скажем, на китайском языке, сохранив значение неизменным.
Однако ваша аналогия с Unicode очень полезна.
Имейте в виду, что Unicode, хотя и является «универсальным» кодом, не включает произношение, значение или использование рассматриваемого символа. Каждая кодовая точка относится к определенному глифу на определенном языке (или, скорее, к сценарию, используемому группой языков). Это элементарно на уровне визуального представления глифа (в пределах стиля, форматирования и шрифтов). Кодовая точка Unicode для латинской буквы A - это именно то, что вам нужно. Это латинская буква «А». Это не может быть автоматически переведено как, скажем, арабская буква Алиф (ﺍ) или индийская (Девнагари) буква «А» (अ).
Продолжая аналогию с Unicode, ваш лексический Unicode будет иметь кодовые точки для каждого слова (словоформы) на каждом языке. Unicode имеет диапазоны кодовых точек для определенного сценария. Ваш лексический Unicode должен иметь ряд кодов для каждого языка. Разные слова на разных языках, даже если они имеют одинаковое значение (синонимы), должны иметь разные кодовые точки. Одно и то же слово, имеющее разные значения или разное произношение (омонимы), должно иметь разные кодовые точки.
В Юникоде для некоторых языков (но не для всех), где один и тот же символ имеет разную форму в зависимости от его положения в слове - например, на иврите и арабском языке форма глифа меняется в конце слова - тогда он имеет другую кодовую точку. Точно так же в вашем лексическом Юникоде, если слово имеет другую форму в зависимости от его положения в предложении, оно может иметь собственный код.
Возможно, самый простой способ придумать кодовые точки для английского языка - это основывать свою систему, скажем, на конкретном издании Оксфордского словаря английского языка и последовательно назначать уникальный код каждому слову. Вам придется использовать разные коды для каждого значения одного и того же слова, и вам придется использовать другой код для разных форм - например, если одно и то же слово может использоваться как существительное и как глагол, то вам понадобится два кода
Затем вам нужно будет сделать то же самое для каждого другого языка, который вы хотите включить, - используя наиболее авторитетный словарь для этого языка.
Скорее всего, это упражнение требует больше усилий, чем оно того стоит. Если вы решите включить все живые языки мира, а также некоторые исторические мертвые и некоторые вымышленные, как это делает Unicode, вы получите настолько большое пространство кода, что ваш код должен быть чрезвычайно широким, чтобы вместить его. Вы ничего не получите с точки зрения сжатия - вполне вероятно, что предложение, представленное как String на исходном языке, займет меньше места, чем такое же предложение, представленное в виде кода.
P.S. для тех, кто говорит, что это невыполнимая задача, потому что значения слов меняются, я не вижу в этом проблемы. Если использовать аналогию с Юникодом, то использование букв изменилось (по общему признанию, не так быстро, как значение слов), но Юникод не имеет никакого отношения к тому, что в Средние века «th» произносилось как «y». Unicode имеет кодовую точку для «t», «h» и «y», и каждый из них служит своей цели.
P.P.S. На самом деле, для Unicode вызывает некоторое беспокойство то, что 'oe' также является 'œ' или что 'ss' может быть написано как 'ß' на немецком языке.
Это интересное небольшое упражнение, но я бы посоветовал вам рассматривать его не более чем как введение в концепцию разницы в естественном языке между типами и токенами.
Тип - это один экземпляр слова, представляющий все экземпляры. Токен - это единичный счет для каждого экземпляра слова. Позвольте мне объяснить это на следующем примере:
«Иоанн пошел в хлебную лавку. Он купил хлеб».
Вот некоторые подсчеты частоты для этого примера, где счетчики означают количество токенов:
John: 1
went: 1
to: 1
the: 2
store: 1
he: 1
bought: 1
bread: 2
Обратите внимание, что «the» засчитывается дважды - есть два жетона «the». Однако обратите внимание, что хотя слов десять, пар слово-частота всего восемь. Слова разбиваются на типы и сопоставляются с их количеством токенов.
Типы и токены полезны в статистическом НЛП. «Лексическое кодирование», с другой стороны, я бы не упустил. Это переход к гораздо более старомодным подходам к НЛП с изобилием препрограммирования и рационализма. Я даже не знаю ни одного статистического МП, которое действительно присваивает конкретный «адрес» слову. Слишком много взаимосвязей между словами, с одной стороны, чтобы построить какую-либо хорошо продуманную числовую онтологию, и если мы просто добавляем числа в слова, чтобы классифицировать их, мы должны думать о таких вещах, как управление памятью и распределение для скорости. .
Я бы посоветовал ознакомиться с NLTK, набором инструментов для естественного языка, написанным на Python, чтобы получить более подробное представление о NLP и его практическом использовании.
Что на первый взгляд кажется трезвой и логичной концепцией, этот вопрос, без сомнения, неверен на многих уровнях - от лексического до прагматического. Это противоречит пониманию языка.