У меня есть приложение .NET, в котором, учитывая существительное, я хочу, чтобы оно правильно добавляло к этому слову префикс «a» или «an». Как мне это сделать?
Прежде чем вы подумаете, что ответ - просто проверить, является ли первая буква гласной, подумайте о таких фразах, как:
- честная ошибка
- подержанная машина
c#
nlp
linguistics
ржаной
источник
источник
Ответы:
Вы, вероятно, не сможете добиться большего, чем это - и это, безусловно, превзойдет большинство систем, основанных на правилах.
Изменить: я реализовал это в JS / C # . Вы можете попробовать его в своем браузере или загрузить небольшую многоразовую реализацию JavaScript, которую он использует. Реализация .NET - это пакет
AvsAn
на nuget . Реализации тривиальны, поэтому при необходимости можно легко перенести на любой другой язык.Оказалось, что «правила» несколько сложнее, чем я думал:
... что просто подчеркивает, что систему, основанную на правилах, будет сложно построить!
источник
Вам нужно использовать список исключений. Я не думаю, что все исключения четко определены, потому что иногда это зависит от акцента человека, произносящего слово.
Один глупый способ - спросить Google о двух возможностях (используя один из поисковых API) и использовать самый популярный:
Или:
Поэтому правильные версии - «европа» и «честный».
источник
Если бы вы могли найти источник написания слов для произношения слов, например:
"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. Но существует множество списков сокращений, как в Википедии, которые вы можете использовать для добавления в исключения.
источник
hawr-uh-buhl
всегда меня смешит.Вы должны реализовать вручную и добавить исключения, которые вы хотите, например, если первая буква - «H», за которой следует «O», например, честный, час ... а также противоположные, такие как европа, университет, используется ...
источник
Поскольку "a" и "an" определяются фонетическими правилами, а не правилами правописания, я, вероятно, сделал бы это так:
источник
Вам необходимо ознакомиться с грамматическими правилами для неопределенных артиклей (в английской грамматике есть только две неопределенные артикли - «a» и «an). Вы можете не согласиться, что это звучит правильно, но правила английской грамматики очень ясны :
Обратите внимание, это означает гласный звук , а не гласную букву. . Например, слова, начинающиеся с молчаливого «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'; }
Вероятно, проще всего создать правило, а затем создать список исключений и использовать его. Не думаю, что их будет так много.
источник
Чувак, я понимаю, что это, вероятно, устоявшийся аргумент, но я думаю, что его можно решить проще, чем использовать специальные правила грамматики из Википедии, которые в лучшем случае выведут народную грамматику.
Наилучшим решением, по-видимому, является использование a или триггера для сопоставления следующего слова на основе фонем, при этом определенные фонемы всегда связаны с «an», а остальные принадлежат «a».
В Университете Карнеги-Меллона есть отличный онлайн-инструмент для таких проверок - http://www.speech.cs.cmu.edu/cgi-bin/cmudict - и содержит 125 тысяч слов с соответствующими 39 фонемами. Добавление слова дает полный набор фонем, из которых важна только первая.
Если слово отсутствует в словаре, например «NSA», и все написано с заглавной буквы, то система может предположить, что это слово является аббревиатурой, и использовать первую букву, чтобы определить, какой неопределенный артикль использовать на основе того же исходного набора правил.
источник
@Nathan Long: Скачать википедию на самом деле неплохая идея. Все изображения, видео и другие медиа не нужны.
Я написал (дрянную) программу на php и javascript (!), Чтобы прочитать всю шведскую википедию (или, по крайней мере, все статьи, к которым можно было добраться из статьи о математике, которая положила начало моему пауку).
Я собрал все слова и внутренние ссылки в базе данных, а также отслеживал частоту каждого слова. Теперь я использую это как базу данных слов для различных задач: * Поиск всех слов, которые могут быть созданы из заданного набора букв (включая подстановочные знаки) * Создан простой файл синтаксиса для шведского языка (все слова, отсутствующие в базе данных, считаются неправильными).
Да, и загрузка всей вики заняла около недели, большую часть времени я использовал ноутбук с подключением на 10 Мбит.
Когда вы на нем, записывайте все вхождения, которые не соответствуют английскому языку, и посмотрите, не являются ли некоторые из них ошибками. Иди исправь их и отдай что-нибудь сообществу.
источник
Обратите внимание, что есть различия между американскими и британскими диалектами, как отметила Grammar Girl в своем эпизоде A Versus An .
источник
Взгляните на Perl Lingua :: EN :: Inflect . Смотрите
sub _indef_article
в исходном коде.источник
Я перенес функцию из Python (изначально из пакета CPAN Lingua-EN-Inflect), которая правильно определяет гласные звуки в C #, и опубликовал ее как ответ на вопрос Программно определить, описывать ли объект с помощью a или an? . Вы можете увидеть фрагмент кода здесь .
источник
Не могли бы вы получить словарь английского языка, в котором хранятся слова, написанные нашим обычным алфавитом и международным фенетическим алфавитом ?
Затем используйте фоенетику, чтобы определить начальный звук слова и, таким образом, подходит ли «а» или «ан»?
Не уверен, что это будет на самом деле проще (или так же весело, как) статистический подход Википедии.
источник
Я бы использовал алгоритм, основанный на правилах, чтобы охватить как можно больше, а затем использовал бы список исключений. Если вы хотите пофантазировать, вы можете попытаться определить некоторые новые «правила» из своего списка исключений.
источник
Я просто похож на набор эвристик. Это должно быть немного сложнее и ответить на некоторые вопросы, на которые у меня никогда не было хорошего ответа, например, как вы относитесь к аббревиатурам («RPM» или «RPM»? Я всегда думал, что последнее имеет больше смысла).
Быстрый поиск привел к лингвистическим библиотекам, которые говорят о том, как обращаться с английским сингулярным префиксом, но вы, вероятно, сможете что-то найти, если достаточно покопаться. А если нет - всегда можно написать собственную библиотеку флексов и снискать мировую известность :-).
источник
Я не думаю, что вы можете просто добавить что-то вроде «a / an» в качестве одношагового покрытия. В противном случае вы получите ошибки предположения, например, все слова с «h» продолжаются «o» получить »вместо« a »как« дом »- (дом?). По сути, вы в конечном итоге включите логику английского языка или время от времени найдете редкие случаи, которые заставят вас выглядеть глупо.
источник
Проверьте, начинается ли слово с гласной или с согласной. «U», как правило, является согласным и гласным («yu»), следовательно, для ваших целей принадлежит к группе согласных.
Буква «h» означает gottal stop (согласный) во французском языке и во французских словах, используемых в английском языке. Вы можете составить их список (на самом деле, включая «честь», «честь» и «час» может быть достаточно) и посчитать их как начинающиеся с гласных (поскольку английский язык не распознает голосовую остановку).
Также считайте «eu» как согласный звук и т. Д.
Это не так уж сложно.
источник
выбор a или a зависит от того, как это слово произносится. Глядя на слово, вы не всегда можете определить его правильное произношение, например, жаргон или аббревиатуру и т. Д. Одним из способов может быть словарь с поддержкой фонем и использование информации о фонемах, связанной со словом, чтобы определить, является ли "a следует использовать "или".
источник
Я не могу быть уверен, что в нем есть соответствующая информация, чтобы различать "a" и "an", но база данных WordNet Принстона существует именно для целей аналогичного типа задач, поэтому я думаю, что вероятно, что данные там . В нем есть несколько десятков тысяч слов и сотни тысяч отношений между сказанными словами (IIRC; я не могу найти текущую статистику на сайте). Посмотри на это. Его можно скачать бесплатно.
источник
Как? А когда? Получите существительное со статьей. Спросите об этом в определенной форме.
Спросите существительное в артикле. Многие элементы кодовой базы MUD хранят элементы как информацию, состоящую из:
Форма ключевого слова может быть "короткий меч ржавый". Краткая форма будет «меч». Длинная форма будет «ржавым коротким мечом».
Вы пишете веб-сервис типа «а против какого»? Сделайте шаг назад и посмотрите, сможете ли вы устранить эту утечку дальше по течению. Вы можете построить плотину, но, если вы не остановите ее течение, она рано или поздно выльется через край.
Определите, насколько это важно, и, как предлагали другие, выберите «быстро, но грубо» или «дорого, но надежно».
источник
Правило очень простое. Если следующее слово начинается с гласного звука, используйте «ан», если оно начинается с согласной, используйте «а». Проблема в том, что наша школьная классификация гласных и согласных не работает. «H» в «honor» - гласная, а «h» в «больнице» - согласная.
Хуже того, некоторые слова, такие как «честный», начинаются с гласной или согласной, в зависимости от того, кто их произносит. Хуже того, некоторые слова меняются в зависимости от слов вокруг них для некоторых говорящих.
Проблема ограничена только тем, сколько времени и усилий вы хотите вложить в нее. Вы можете написать что-нибудь в паре, используя «aeiou» в качестве гласных за пару минут, или вы можете потратить месяцы на лингвистический анализ вашей целевой аудитории. Между ними существует огромное количество эвристик, которые будут правильными для одних говорящих и неправильными для других, но поскольку разные говорящие имеют разные определения одного и того же слова, просто невозможно быть правым все время, независимо от того, как вы это делаете. Это.
источник
Идеальным подходом было бы найти в Интернете место, где можно получить ответы, динамически запрашивать их и кэшировать ответы. Для начала вы можете ввести в систему несколько сотен слов.
(Я не знаю такого онлайн-источника, но не удивлюсь, если он есть.)
источник
Итак, разумное решение возможно без загрузки всего Интернета. Вот что я сделал:
Я вспомнил , что Google опубликовал свои исходные данные для частот Google Книги N-Gram здесь . Итак, я скачал 2-граммовые файлы для "a_" и "an". Около 26 гигов, если я правильно помню. Исходя из этого, я составил список строк, в которых им в подавляющем большинстве предшествовала противоположная статья, которую вы ожидали (если бы мы ожидали, что гласные будут иметь «ан»). Последний список слов, который я смог сохранить, меньше 7 килобайт.
источник
Вы используете «а», когда следующее слово не является гласным? И вы используете «ан», когда есть гласная?
С учетом сказанного, не могли бы вы просто создать регулярное выражение типа «a \ s [a, e, i, o, u]. *»? А затем замените его на "an?"
источник