Как правильно задать слово «a» и «an»?

У меня есть приложение .NET, где, учитывая существительное, я хочу, чтобы он правильно префикс этого слова с помощью «a» или «an». Как мне это сделать?

Прежде чем вы подумаете, что ответ состоит в том, чтобы просто проверить, является ли первая буква гласным, рассмотрите такие фразы, как:

  • честная ошибка
  • подержанный автомобиль

  1. Загрузить Википедию
  2. Разархивируйте его и напишите программу быстрого фильтра, которая выплевывает только текст статьи (загрузка, как правило, в формате XML, а также метаданные не из статьи).
  3. Найдите все экземпляры a (n) …. и создайте индекс для следующего слова и всех его префиксов (для этого вы можете использовать простой пример). Это должно быть чувствительным к регистру, и вам понадобится максимальная длина слова – 15 букв?
  4. (необязательно) Откажитесь от всех префиксов, которые происходят менее 5 раз или где «a» и «an» достигает менее 2/3 голосов (или некоторые другие настройки). Предпочтительно сохранить пустой префикс, чтобы избежать угловых шкафов.
  5. Вы можете оптимизировать свою префиксную базу данных, отбросив все префиксы, чей родитель имеет общую аннотацию «a» или «an».
  6. При определении того, следует ли использовать «A» или «AN», найдите самый длинный совпадающий префикс и следуйте его примеру. Если вы не отбросили пустой префикс на шаге 4, тогда всегда будет подходящий префикс (а именно пустой префикс), в противном случае вам может понадобиться специальный случай для полностью несоответствующей строки (такой ввод должен быть очень редкими) ,

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

Изменить: Я реализовал это в JS / C # . Вы можете попробовать его в своем браузере или загрузить небольшую, многоразовую реализацию javascript, которую он использует. Реализация .NET представляет собой пакет AvsAn на AvsAn . Реализации тривиальны, поэтому при необходимости следует легко переносить на любой другой язык.

Оказывается, «правила» довольно сложны, чем я думал:

  • это непредвиденный результат, но это единогласное голосование
  • это честное решение, но кустарник из жимолости
  • Символы: это номер 0800 или ∞ орегано.
  • Сокращения: Это ученый НАСА, но аналитик NSA; автомобиль FIAT, но политика FAA.

… который просто подчеркивает, что система, основанная на правилах, будет сложной для построения!

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

Один глупый способ – попросить Google обойти две возможности (используя один из API поиска) и использовать самые популярные:

Или:

Поэтому «европа» и «честный» – правильные версии.

Если вы могли бы найти источник слов для написания слов, например:

 "honest":"on-ist" "horrible":"hawr-uh-buhl, hor-" 

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

Отредактировано для добавления:

!!! – Я думаю, вы могли бы использовать это для генерации своих исключений: http://www.speech.cs.cmu.edu/cgi-bin/cmudict

Разумеется, не все будет в словаре, а это означает, что не все возможные исключения заканчиваются в ваших наборах исключений, но в этом случае вы можете просто по умолчанию использовать гласные / a для согласных или использовать другие эвристики с лучшими коэффициентами.

(Просматривая словарь CMU, я был рад видеть, что он включает в себя собственные существительные для стран и некоторых других мест, поэтому он будет приводить примеры, такие как «украинский», «документ USA Today», «картина, вдохновленная Уралом»).

Редактирование еще раз, чтобы добавить: словарь CMU не содержит общих сокращений, и вам нужно беспокоиться о тех, которые начинаются с s, f, l, m, n, u и x. Но есть много списков сокращений, например, в Википедии, которые вы можете использовать для добавления к исключениям.

Вы должны выполнить вручную и добавить исключения, которые вы хотите, например, если первая буква «H», а затем «O», как честный, час … а также противоположные, такие как europe, university, used …

Поскольку «a» и «an» определяется фонетическими правилами, а не соглашениями о орфографии, я бы сделал это следующим образом:

  1. Если первая буква слова является согласным -> ‘a’
  2. Если первая буква слова гласная -> а,
  3. Храните список исключений (сердце, рентген, дом), как говорит rjumnro .

Вам нужно посмотреть на грамматические правила для неопределенных статей (в английской грамматике есть только две неопределенные статьи – «a» и «an»). Вы можете не согласиться с этим звуком, но правила английской грамматики очень ясны :

«Слова a и a являются неопределенными статьями. Мы используем неопределенную статью перед словами, которые начинаются с гласного звука (a, e, i, o, u) и неопределенной статьи a перед словами, которые начинаются созвучным звуком (все другие буквы).

Обратите внимание, что это означает гласный звук , а не гласную букву . Например, слова, начинающиеся с молчаливого «h», такие как «честь» или «наследник», рассматриваются как гласные, так что продолжаются «an» – например, «Для меня большая честь встретиться». Слова, начинающиеся с согласного звука, префиксны – вот почему вы говорите «подержанный автомобиль», а не «подержанный автомобиль», потому что «используется» имеет звук «yoose», а не звук «uhh».

Итак, как программист, это правила для подражания. Вам просто нужно выработать способ определения того, с какого слова начинается слово, а не с какой буквы. Я видел примеры этого, такие как этот на PHP Джейми Сирович:

 function aOrAn($next_word) { $_an = array('hour', 'honest', 'heir', 'heirloom'); $_a = array('use', 'useless', 'user'); $_vowels = array('a','e','i','o','u'); $_endings = array('ly', 'ness', 'less', 'lessly', 'ing', 'ally', 'ially'); $_endings_regex = implode('|', $_endings); $tmp = preg_match('#(.*?)(-| |$)#', $next_word, $captures); $the_word = trim($captures[1]); //$the_word = Format::trimString(Utils::pregGet('#(.*?)(-| |$)#', $next_word, 1)); $_an_regex = implode('|', $_an); if (preg_match("#($_an_regex)($_endings_regex)#i", $the_word)) { return 'an'; } $_a_regex = implode('|', $_a); if (preg_match("#($_a_regex)($_endings_regex)#i", $the_word)) { return 'a'; } if (in_array(strtolower($the_word{0}), $_vowels)) { return 'an'; } return 'a'; } 

Возможно, проще всего создать правило, а затем создать список исключений и использовать его. Я не думаю, что этого будет много.

@Nathan Long: Загрузка википедии на самом деле неплохая идея. Все изображения, видео и другие носители не нужны.

Я написал (дерьмовую) программу в php и javascript (!), Чтобы прочитать всю шведскую википедию (или, по крайней мере, все арки, которые можно было бы получить из aricle о математике, что было началом для моего паука).

Я собрал все слова и внутренние ссылки в базе данных, а также отслеживал частоту каждого слова. Теперь я использую это как базу данных слов для различных задач: * Поиск всех слов, которые могут быть созданы из заданного набора букв (включая подстановочный знак) * Создал простой файл синтаксиса для шведского языка (все слова, не содержащиеся в базе данных, считаются некорректными).

О, и загрузка всей вики заняла около недели, используя мой ноутбук, работающий большую часть времени, с подключением 10 Мбит.

Когда вы на нем, запишите все вхождения, которые несовместимы с английским языком, и посмотрите, есть ли некоторые из них ошибки. Пойдите исправить их и вернуть что-то в сообщество.

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

Кажется, лучшим решением является использование или триггера подбора на основе фонемы следующего слова, причем некоторые фонемы всегда связаны с «а», а остальные – «а».

Университет Карнеги-Меллона имеет отличный онлайн-инструмент для таких проверок – http://www.speech.cs.cmu.edu/cgi-bin/cmudict – и по 125 тыс. Слов с соответствующими 39 фонемами. Подключая слово, вы получаете весь фонетический набор, из которого важна только первая.

Если слово не отображается в словаре, например «NSA» и все капитализируется, система может считать слово «Акроним» и использовать первую букву, чтобы определить, какую неопределенную статью использовать на основе того же исходного набора правил.

Обратите внимание, что существуют различия между американскими и британскими диалектами, как отметила Грамматическая девушка в своем эпизоде ​​« А против А» .

Одно из осложнений заключается в том, что слова произносятся по-разному на английском и английском языках. Например, слово для определенного вида растения произносится как «erb» на американском английском и «herb» на британском английском языке. В редких случаях, когда это проблема, используйте форму, которая будет ожидаться в вашей стране или большинству ваших читателей.

Взгляните на Perl’s Lingua :: EN :: Inflect . См. sub _indef_article в исходном коде.

Я портировал функцию из Python (первоначально из пакета CPAN Lingua-EN-Inflect), который правильно определяет гласные звуки в C # и отправил его в качестве ответа на вопрос. Программно определить, следует ли описывать объект с помощью a или? , Здесь вы можете увидеть fragment кода.

Не могли бы вы получить английский словарь, в котором хранятся слова, написанные на нашем обычном алфавите, и Международный фонетический алфавит ?

Затем используйте phoenetics, чтобы понять начальный звук слова, и, следовательно, подходит ли «a» или «an»?

Не уверен, что на самом деле это будет проще, чем (или, что очень забавно, как) статистический подход Википедии.

Я бы использовал алгоритм, основанный на правилах, чтобы охватить столько, сколько мог, а затем использовать список исключений. Если вы хотите получить фантазию, вы можете попытаться определить некоторые новые «правила» из вашего списка исключений.

Я просто выгляжу как набор эвристик. Это должно быть немного сложнее и отвечать на некоторые вопросы, на которые у меня никогда не было хорошего ответа, например, как вы относитесь к аббревиатурам («RPM» или «RPM»? Я всегда думал, что последнее имеет больше смысла).

Быстрый поиск, полученный в лингвистических библиотеках, которые говорят о том, как обращаться с английским сингулярным префиксом, но вы, вероятно, можете найти что-то, если достаточно выкупить. А если нет – вы всегда можете написать свою собственную библиотеку флексии и получить мировую известность :-).

Я не думаю, что вы можете просто заполнить некоторые элементы плиты котла, такие как «a / an», как одношаговое покрытие. В противном случае вы получите ошибки допущения, как и все слова с «h», продолжайте «o» получить «an» вместо «a», как «home» – (дом?). В принципе, вы в конечном итоге включите логику английского языка или случайно найдете редкие случаи, которые заставят вас выглядеть глупо.

Проверьте, начинается ли слово с гласного или согласного. «U», как правило, является согласным и гласным («yu»), поэтому входит в согласную группу для ваших целей.

Буква «h» обозначает стоп-сигнал (согласный) на французском и французском языках, который используется на английском языке. Вы можете составить список этих (на самом деле, в том числе «честь», «честь» и «час» может быть достаточным) и считать их начальными с гласных (так как английский не признает глотальную остановку).

Также считайте «eu» как согласный и т. Д.

Это не слишком сложно.

выбор a или a зависит от того, как произносится слово. Рассматривая это слово, вы не можете точно сказать его правильное произношение, например, жаргон или аббревиатуру и т. Д. Одним из способов может быть наличие словаря с поддержкой фонем и использование информации фонемы, связанной со словом, чтобы определить, является ли «a »или« an ».

Я не могу быть уверен, что в нем есть соответствующая информация, чтобы различать «a» и «an», но firebase database WordStore Princeton существует именно для целей подобных задач, поэтому я думаю, что, вероятно, данные находятся там , У этого есть несколько десятков тысяч слов и сотни тысяч отношений между указанными словами (IIRC, я не могу найти текущую статистику на сайте). Посмотрите. Это свободно загружаемый файл.

Как? Как насчет того, когда? Получите существительное с прилагаемой статьей. Попросите его в определенной форме.

Попросите существительное со статьей. Многие объекты кодовой базы MUD хранят информацию в виде:

  • один или несколько ключевых слов
  • короткая форма
  • длинная форма

Ключевой формой может быть «короткий меч ржавый». Короткая форма будет «мечом». Длинная форма будет «ржавым коротким мечом».

Вы пишете «против» веб-сервиса? Сделайте шаг назад и посмотрите, можете ли вы атаковать эту утечку дальше вверх по течению. Вы можете построить плотину, но если вы не остановите ее, она в конце концов прольется.

Определите, насколько это важно, и, как предложили другие, пойти на «быстрый, но грубый» или «дорогой, но прочный».

Правило очень простое. Если следующее слово начинается с гласного звука, используйте «an», если он начинается с согласного, тогда используйте «a». Трудно сказать, что наша школьная classификация гласных и согласных не работает. «H» в «чести» является гласным, но «h» в «больнице» является согласным.

Хуже того, некоторые слова, такие как «честные», начинаются с гласного или согласного в зависимости от того, кто их говорит. Хуже того, некоторые слова меняются в зависимости от слов вокруг них для некоторых ораторов.

Проблема ограничена только тем, сколько времени и усилий вы хотите вложить в нее. Вы можете написать что-то в паре, используя «aeiou» в качестве гласных за пару минут, или вы можете потратить месяцы на лингвистический анализ вашей целевой аудитории. Между ними огромное количество эвристик, которые будут подходящими для некоторых ораторов и неправильными для других, но поскольку у разных ораторов есть разные определения для одного и того же слова, просто невозможно быть правильным все время независимо от того, как вы это делаете Это.

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

(Я не знаю такого онлайн-источника, но я не удивлюсь, если он есть.)

Таким образом, разумное решение возможно без загрузки всего Интернета. Вот что я сделал:

Я вспомнил, что Google опубликовал свои необработанные данные для частот N-Gram в Google Книгах. Поэтому я загрузил 2-граммовые файлы для «a_» и «an». Если я правильно помню, это около 26 концертов. Из этого я подготовил список строк, где им в подавляющем большинстве предшествовала противоположная статья, которую вы ожидали бы (если бы мы ожидали, что гласные возьмут «an»). Этот окончательный список слов, которые я смог хранить в менее чем 7 килобайтах.

Вы используете «a», когда следующее слово не является гласным? И вы используете «an» всякий раз, когда есть гласная?

С учетом сказанного, не могли бы вы просто сделать регулярное выражение типа «a \ s [a, e, i, o, u]. *”? А затем замените его на «an?»

Давайте будем гением компьютера.