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

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

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

  • честная ошибка
  • подержанная машина

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Или:

Поэтому "Европа" и "честный" являются правильными версиями.

Ответ 3

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

"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. Но есть множество списков сокращений, например, в Википедии, которые вы можете использовать для добавления к исключениям.

Ответ 4

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

Ответ 5

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

  • Если первая буква слова является согласным → 'a'
  • Если первая буква слова гласная → 'an'
  • Сохраните список исключений (сердце, рентген, дом) в качестве rjumnro.

Ответ 6

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

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

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

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

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'; 
}

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

Ответ 7

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

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

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

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

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

Ответ 8

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

Лучшим решением, по-видимому, является использование или триггера сопоставления на основе фонемы следующего слова, причем некоторые фонемы всегда связаны с "an", а остальные - "a".

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

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

Ответ 9

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

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

Ответ 10

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

Ответ 12

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

Затем используйте phoenetics для определения начального звука слова и, следовательно, подходит ли "a" или "an"?

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

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

Ответ 16

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

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

Также считайте "eu" как согласный и т.д.

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

Ответ 17

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

Ответ 18

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

Ответ 19

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

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

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

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

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

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

Ответ 20

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

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

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

Ответ 21

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

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

Ответ 22

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

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

Ответ 23

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

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