Как правильно поставить перед словом «а» и «ан»?


93

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

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

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

4
Вы также должны учитывать аббревиатуры, которые также могут привести к путанице в том, что "a" или "an" вроде "NHL", которое также встречается, звук буквы начинается с гласной, хотя не, если аббревиатура может быть произнесена как слово, например как «устройство NAS» или «событие NASCAR»
Дж. Б. Кинг,

5
Также имейте в виду, что использование a или an может зависеть от конкретного произношения в разновидности английского языка. Британское и американское произношение травы - один из таких примеров.
Эрик

12
@Eric: Действительно, мой любимый пример (тоже ботаника) - "SQL". Некоторые люди произносят буквы «SQL», некоторые произносят это слово как «продолжение». Каждый получает разную «а» или «знаком». например, это «оператор продолжения» стихи «это оператор SQL»
Binary Worrier

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

Ах ... "претендент Х". Я хорошо помню свою первую встречу с ним. Книга по обществоведению для второго класса под названием «Историческое общество», книга о колониальном Вильямсбурге.
Боб Кауфман,

Ответы:


136
  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на nuget . Реализации тривиальны, поэтому при необходимости можно легко перенести на любой другой язык.

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

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

... что просто подчеркивает, что систему, основанную на правилах, будет сложно построить!


И если в выходных данных отсутствует существительное, вы, безусловно, можете вернуться к простому механизму правил.
Джон Фишер,

26
Учитывая, что загрузка Wikipedia распаковывается до (в настоящее время) 2,8 Терабайта, было бы здорово, если бы кто-нибудь, кто использует этот метод, опубликовал бы полученные данные публично, чтобы процесс не приходилось повторять много раз.
Натан Лонг

10
Этот ответ был не совсем серьезным, но я сделал что-то вроде этого, и файл .xml википедии с необработанной wikimarkup составляет всего порядка 40 ГБ (самый новый всегда немного больше), а не 2,8 ТБ - все в одном файле - не загружайте расширенную версию .html или какие-либо изображения, может быть, это версия объемом 2,8 ТБ? В любом случае, разобрать это вполне реально, если только вы не придирчивы к разметке.
Eamon Nerbonne

1
Это один из самых больших легко доступных и актуальных наборов данных на естественном языке, о котором я только мог подумать. Впрочем, любой дополнительный источник данных тоже подойдет, ведь алгоритм не зависит от википедии. Вы можете опробовать онлайн-реализацию на сайте home.nerbonne.org/A-vs-An или в моем блоге
Eamon Nerbonne

1
Я был вне впечатлен этим решением. Я искренне думал, что это будет намного проще, чем скачивать Википедию целиком. Молодец, сэр. +1
Кехлан Крумме

15

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

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

Или:

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


6
Это действительно разрешенное использование или это просьба о запрете? IIRC, безусловно, не одобряет регулярное такое использование.
Эмон Нербон

1
@Eamon: Интересный момент. Что, если бы приложение сохраняло запись всех слов, которые оно ранее искало в гугле, поэтому ему нужно было гуглить только один раз для каждого нового встречающегося слова? Будет ли это по-прежнему сомнительным использованием Google?
gnovice

2
Помимо очевидных технических трудностей (использование вывода поисковой системы в автоматическом режиме недопустимо и будет довольно быстро заблокировано), это не решает проблему правильным образом - в худшем случае это дублирует обычное неправильное использование синтаксис.
Guss

6
В худшем случае? Есть довольно веские аргументы в пользу того, что дублирование «обычных злоупотреблений» - это именно то, к чему должна стремиться система естественного языка. См. Эссе Дэвида Фостера Уоллеса «Авторитет и американское использование» в книге « Рассмотрим омара» . Есть корпуса получше Google, но это уже другая проблема.
Роберт Россни

2
И «отель», и «героиня» кажутся мне правильными. Я полагаю, вы исходите с точки зрения легкого акцента кокни. Различные акценты означают, что на некоторые из этих слов нет правильного ответа.
rjmunro

15

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

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

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

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

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

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

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

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


2
Ничего не могу с собой поделать, но это hawr-uh-buhlвсегда меня смешит.
IllidanS4 поддерживает Монику

9

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


1
да, настоящий мужчина. Думаю, я ошибался в этом. Нет никаких правил,
Ахмад Фарид

8

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

  1. Если первая буква слова - согласная -> 'а'
  2. Если первая буква слова - гласная -> 'an'
  3. Ведите список исключений (сердце, рентген, дом), как говорит Рюмнро .

5

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

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

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

Итак, как программист, это правила, которым нужно следовать. Вам просто нужно выработать способ определения, с какого звука начинается слово, а не с какой буквы. Я видел примеры этого, например, этот в 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'; 
}

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


4

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

Наилучшим решением, по-видимому, является использование a или триггера для сопоставления следующего слова на основе фонем, при этом определенные фонемы всегда связаны с «an», а остальные принадлежат «a».

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

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


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

3

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

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

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

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

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


2

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

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




1

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

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

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


0

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


0

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

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


Сокращения, такие как RPM, не проблема. Как вы говорите, к ним можно относиться любым способом. Следовательно, решение очевидно: игнорировать их.
Эндрю Дж. Брем,

Я бы не согласился, потому что это приводит к непоследовательности префиксов. Простое игнорирование этого вызовет "RPM" и "UGC", что явно неверно.
Guss

0

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


0

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

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

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

Это не так уж сложно.


0

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


0

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


0

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

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

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

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

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

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


0

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

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

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


0

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

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


0

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

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


-2

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

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


Нет, потому что правило о гласных звуках , а не гласных букв . «Пользователь» начинается с гласной, а произношение - нет.
Джорис Гроосман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.