Como posso prefixar corretamente uma palavra com “a” e “an”?

93

Eu tenho um aplicativo .NET onde, dado um substantivo, quero prefixar corretamente essa palavra com "a" ou "an". Como eu faria isso?

Antes de pensar, a resposta é simplesmente verificar se a primeira letra é uma vogal, considere frases como:

  • um erro honesto
  • um carro usado
Ryeguy
fonte
4
Você também deve considerar abreviações que também podem levar a algumas confusões sobre o "um" ou "uma" como "um NHL" que também surge quando o som de uma letra começa com uma vogal, embora não se a abreviatura puder ser pronunciada como uma palavra como como "um dispositivo NAS" ou "um evento NASCAR"
JB King
5
Lembre-se também de que o uso de a ou de pode depender da pronúncia específica na variedade de inglês falado. A pronúncia britânica e americana da erva é um exemplo.
Eric
12
@Eric: De fato, meu exemplo favorito disso (nerd também) é "SQL". Algumas pessoas dizem as letras "SQL", algumas pessoas pronunciam como a palavra "sequela". Cada um recebe um "a" ou "an" diferente. por exemplo, é "uma instrução sequencial" versos "é uma instrução SQL"
Binary Worrier
Ainda mais difícil é que as opiniões divergem dentro do mesmo dialeto do inglês! Por exemplo, o inglês oficial (Reino Unido) nos diz que "um hotel" é a estrutura correta, mas a maioria das pessoas usaria "um hotel" nas conversas do dia a dia. Se você escrever um, será muito útil para o resto de nós!
h4xxr
Ah ... o "aspirante H". Lembro-me vividamente de meu primeiro encontro com ele. Um livro de estudos sociais da segunda série intitulado "An Historical Society", um livro sobre Williamsburg colonial.
Bob Kaufman

Respostas:

137
  1. Baixar Wikipedia
  2. Descompacte-o e escreva um programa de filtro rápido que libere apenas o texto do artigo (o download geralmente está no formato XML, junto com metadados que não são do artigo).
  3. Encontre todas as instâncias de a (n) .... e faça um índice na palavra seguinte e todos os seus prefixos (você pode usar um sufixo simples para isso). Deve ser sensível a maiúsculas e minúsculas e você precisará de um comprimento máximo de palavra - 15 letras?
  4. (opcional) Descarte todos os prefixos que ocorrem menos de 5 vezes ou onde "a" vs. "uma" atinge menos de 2/3 da maioria (ou algum outro limite - ajuste aqui). De preferência, mantenha o prefixo vazio para evitar casos extremos.
  5. Você pode otimizar seu banco de dados de prefixos descartando todos os prefixos cujo pai compartilha a mesma anotação "a" ou "uma".
  6. Ao determinar se deve usar "A" ou "AN", encontre o prefixo correspondente mais longo e siga seu exemplo. Se você não descartou o prefixo vazio na etapa 4, sempre haverá um prefixo correspondente (ou seja, o prefixo vazio), caso contrário, você pode precisar de um caso especial para uma string completamente não correspondente (essa entrada deve ser muito rara) .

Você provavelmente não pode ficar muito melhor do que isso - e certamente vencerá a maioria dos sistemas baseados em regras.

Edit: Eu implementei isso em JS / C # . Você pode experimentá-lo em seu navegador ou fazer download da implementação javascript pequena e reutilizável que ele usa. A implementação do .NET é um pacote AvsAnem nuget . As implementações são triviais, portanto, deve ser fácil portar para qualquer outra linguagem, se necessário.

Acontece que as "regras" são um pouco mais complexas do que eu pensava:

  • é um resultado imprevisto, mas é uma votação unânime
  • é uma decisão honesta, mas um arbusto de madressilva
  • Símbolos: É um número 0800 ou um ∞ de orégano.
  • Siglas: É um cientista da NASA, mas um analista da NSA; um carro FIAT, mas uma política da FAA.

... o que apenas sublinha que um sistema baseado em regras seria complicado de construir!

Eamon Nerbonne
fonte
E se um substantivo estiver faltando nesta saída, você certamente pode recorrer ao mecanismo de regras simples.
John Fisher
26
Dado que o download da Wikipedia é descompactado para (atualmente) 2,8 Terabytes, seria ótimo se alguém que usa esse método postasse os dados resultantes publicamente para que o processo não precisasse ser repetido muito.
Nathan Long
10
Essa resposta não foi totalmente séria, mas eu fiz algo parecido com isso, e o arquivo .xml da wikipedia com wikimarkup bruto está apenas na ordem de 40 GB (o mais recente é sempre um pouco maior), não 2,8 TB - tudo em um arquivo - não baixe a versão .html expandida ou qualquer imagem, talvez seja a versão que tem 2.8 TB? Em qualquer caso, é bastante viável analisar, desde que você não seja muito exigente com a marcação.
Eamon Nerbonne
1
É um dos maiores conjuntos de dados de linguagem natural facilmente disponíveis e atualizados que eu poderia imaginar. No entanto, qualquer fonte de dados adicional também serve, é claro - o algoritmo não depende da wikipedia, afinal. Você pode experimentar a implementação online em home.nerbonne.org/A-vs-An ou no meu blog
Eamon Nerbonne,
1
Fiquei além de impressionado com esta solução. Sinceramente, pensei que seria muito mais simples do que baixar a Wikipedia por completo. Muito bem, senhor. +1
Kehlan Krumme
15

Você precisa usar uma lista de exceções. Não acho que todas as exceções estejam bem definidas, porque às vezes depende do sotaque de quem fala a palavra.

Uma maneira estúpida é pedir ao Google as duas possibilidades (usando uma das APIs de pesquisa) e usar a mais popular:

Ou:

Portanto, "uma europa" e "um honesto" são as versões corretas.

rjmunro
fonte
6
Esse uso é realmente permitido ou está pedindo para ser banido? Esse uso regular é certamente desaprovado pelo IIRC.
Eamon Nerbonne
1
@Eamon: Ponto interessante. E se o aplicativo mantiver um registro de todas as palavras que ele pesquisou anteriormente, de modo que ele só precise pesquisar no Google uma vez para cada nova palavra que encontrar? Ainda seria um uso questionável do Google?
gnovice
2
Além das dificuldades técnicas óbvias (o uso de um resultado de mecanismo de pesquisa de maneira automatizada como essa não é permitido e será bloqueado rapidamente), isso não resolve o problema de forma correta - na pior das hipóteses, duplicará o uso indevido comum de sintaxe.
Guss de
6
Na pior das hipóteses? Há um argumento bastante forte de que duplicar o "mau uso comum" é exatamente o que um sistema de linguagem natural deve se esforçar. Ver o ensaio de David Foster Wallace "Authority and American Usage", em Consider the Lobster . Existem corpora melhores para usar do que o Google, mas esse é um problema diferente.
Robert Rossney
2
"um hotel" e "uma heroína" parecem certos para mim. Eu acho que você está vindo de uma perspectiva ligeiramente sotaque cockney. Acentos diferentes significam que não existe uma resposta certa para algumas dessas palavras.
rjmunro
15

Se você pudesse encontrar uma fonte de grafia de palavras para pronúncias de palavras, como:

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

Você pode basear sua decisão no primeiro caractere da seqüência de pronúncia soletrada. Para desempenho, talvez você possa usar essa pesquisa para pré-gerar conjuntos de exceções e usar esses conjuntos de pesquisa menores durante a execução.

Editado para adicionar:

!!! - Acho que você poderia usar isso para gerar suas exceções: http://www.speech.cs.cmu.edu/cgi-bin/cmudict

Nem tudo estará no dicionário, é claro - o que significa que nem todas as exceções possíveis acabariam em seus conjuntos de exceções - mas, nesse caso, você poderia apenas usar como padrão um for vogais / a para consoantes ou usar alguma outra heurística com melhores chances.

(Olhando através do dicionário CMU, fiquei satisfeito em ver que inclui nomes próprios para países e alguns outros lugares - então ele vai mostrar exemplos como "um ucraniano", "um jornal do USA Today", "uma pintura inspirada nos Urais".)

Editando mais uma vez para adicionar: O dicionário CMU não contém acrônimos comuns e você deve se preocupar com aqueles que começam com s, f, l, m, n, u e x. Mas há muitas listas de acrônimos por aí, como na Wikipedia, que você pode usar para adicionar às exceções.

Anon
fonte
2
Não consigo evitar, mas hawr-uh-buhlsempre me faz rir.
IllidanS4 quer Monica de volta em
9

Você tem que implementar manualmente e adicionar as exceções que deseja, como por exemplo se a primeira letra for 'H' e seguida por um 'O' como honesto, hora ... e também os opostos como europa, universidade, usado ...

Ahmad Farid
fonte
1
sim, homem verdadeiro. Acho que me enganei nisso. Não tem regra alguma
Ahmad Farid
8

Uma vez que "a" e "an" são determinados por regras fonéticas e não por convenções ortográficas, eu provavelmente faria assim:

  1. Se a primeira letra da palavra for uma consoante -> 'a'
  2. Se a primeira letra da palavra for uma vogal-> 'uma'
  3. Mantenha uma lista de exceções (coração, raio-x, casa), como diz rjumnro .
Patrik Svensson
fonte
5

Você precisa examinar as regras gramaticais para artigos indefinidos (existem apenas dois artigos indefinidos na gramática inglesa - "a" e "an). Você pode não concordar que isso soe correto, mas as regras da gramática inglesa são muito claras :

"As palavras ae an são artigos indefinidos. Usamos o artigo indefinido an antes de palavras que começam com o som de uma vogal (a, e, i, o, u) e o artigo indefinido a antes de palavras que começam com um som consonantal (todas outras letras). "

Observe que isso significa um som de vogal , e não uma letra de vogal . Por exemplo, palavras que começam com um "h" silencioso, como "honra" ou "herdeiro" são tratadas como vogais e, portanto, são iniciadas com "uma" - por exemplo, "É uma honra conhecê-lo". Palavras que começam com um som consonantal são prefixadas com um - é por isso que você diz "um carro usado" em vez de "um carro usado" - porque "usado" tem um som de "yoose" em vez de um som "uhh".

Portanto, como programador, essas são as regras a seguir. Você só precisa descobrir uma maneira de determinar com que som começa uma palavra, em vez de com qual letra. Já vi exemplos disso, como este em PHP de 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'; 
}

Provavelmente, é mais fácil criar a regra e, em seguida, criar uma lista de exceções e usá-la. Eu não imagino que haverá tantos.

Dan Diplo
fonte
4

Cara, eu percebo que este é provavelmente um argumento estabelecido, mas acho que pode ser resolvido mais facilmente do que usar regras gramaticais ad hoc da Wikipedia, que derivariam a gramática vernacular, na melhor das hipóteses.

A melhor solução, ao que parece, é fazer com que o uso de a ou an acione uma combinação fonêmica da palavra seguinte, com certos fonemas sempre associados a "an" e o restante pertencendo a "a".

A Carnegie Mellon University tem uma ótima ferramenta online para esse tipo de verificação - http://www.speech.cs.cmu.edu/cgi-bin/cmudict - e 125k palavras com os 39 fonemas correspondentes. Conectar uma palavra fornece todo o conjunto fonêmico, do qual apenas o primeiro é importante.

Se a palavra não aparecer no dicionário, como "NSA" e estiver em maiúsculas, o sistema pode assumir que a palavra é um acrônimo e usar a primeira letra para determinar qual artigo indefinido usar com base no mesmo conjunto de regras original.

humano conhecido
fonte
1
Em termos de economia de recursos, esta é a melhor resposta, e não vejo por que isso teria um desempenho pior do que os métodos propostos com muito mais dados intensivos.
Projeto Chthonic
3

@Nathan Long: Baixar a Wikipedia não é uma má ideia. Todas as imagens, vídeos e outras mídias não são necessárias.

Eu escrevi um programa (crappy) em php e javascript (!) Para ler toda a wikipedia sueca (ou pelo menos todos os artigos que pudessem ser encontrados a partir do artigo sobre matemática, que foi o começo para minha aranha).

Coletei todas as palavras e links internos em um banco de dados e também acompanhei a frequência de cada palavra. Agora eu uso isso como um banco de dados de palavras para várias tarefas: * Encontrar todas as palavras que podem ser criadas a partir de um determinado conjunto de letras (incluindo curinga) * Criar um arquivo de sintaxe simples para sueco (todas as palavras que não estão no banco de dados são consideradas incorretas).

Ah, e o download de todo o wiki demorou cerca de uma semana, usando meu laptop rodando a maior parte do tempo, com conexão de 10Mbit.

Quando você estiver nisso, registre todas as ocorrências que são inconsistentes com o idioma inglês e veja se algumas delas são erros. Vá consertá-los e dar algo em troca para a comunidade.

Per Alexandersson
fonte
2

Observe que há diferenças entre os dialetos americanos e britânicos, como Grammar Girl apontou em seu episódio A Versus An .

Uma complicação é quando as palavras são pronunciadas de maneira diferente no inglês britânico e no inglês americano. Por exemplo, a palavra para um certo tipo de planta é pronunciada “erb” no inglês americano e “erva” no inglês britânico. Nos raros casos em que isso é um problema, use o formulário que será esperado em seu país ou pela maioria de seus leitores.

Jan Aagaard
fonte
2

Dê uma olhada em Lingua :: EN :: Inflect do Perl . Veja sub _indef_articleno código fonte.

Sinan Ünür
fonte
As exceções estão localizadas em inflexões. Parece-me que a lista está bastante incompleta.
Jan Aagaard
1

Você poderia conseguir um dicionário de inglês que armazene as palavras escritas em nosso alfabeto regular e no alfabeto fenético internacional ?

Em seguida, use a fenética para descobrir o som inicial da palavra e, portanto, se “a” ou “an” é apropriado?

Não tenho certeza se isso seria realmente mais fácil (ou tão divertido quanto) a abordagem estatística da Wikipedia.

Paul D. Waite
fonte
0

Eu usaria um algoritmo baseado em regras para cobrir o máximo que pudesse e, em seguida, usaria uma lista de exceções. Se você quiser ser sofisticado, poderá tentar determinar algumas novas "regras" de sua lista de exceções.

AL Flanagan
fonte
0

Eu só me pareço com um conjunto de heurísticas. Precisa ser um pouco mais complicado e responder a algumas coisas para as quais nunca obtive uma boa resposta, por exemplo, como tratam as abreviaturas ("um RPM" ou "um RPM"? Sempre achei que o último fazia mais sentido).

Uma busca rápida resultou em bibliotecas linguísticas que falam sobre como lidar com o prefixo singular do inglês, mas você provavelmente poderá encontrar algo se pesquisar bastante. E se não - você sempre pode escrever sua própria biblioteca de inflexões e ganhar fama mundial :-).

Guss
fonte
Abreviações como RPM não são um problema. Como você disse, eles podem ser tratados de qualquer maneira. Portanto, a solução é óbvia: ignore-os.
Andrew J. Brehm
Eu não concordaria porque isso causa prefixação inconsistente. Ignorá-lo causaria "um RPM" e "um UGC", o que está claramente errado.
Guss
0

Eu não suponho que você possa simplesmente preencher algumas coisas padrão como 'um / an' como um resumo de uma etapa. Caso contrário, você terminará com erros de suposição como todas as palavras com 'h' procedem de 'o' get 'an' em vez de 'a' como 'home' - (uma casa?). Basicamente, você acabará incluindo a lógica da língua inglesa ou ocasionalmente encontrará casos raros que o farão parecer um tolo.


fonte
0

Verifique se uma palavra começa com uma vogal ou consoante. Um "u" é geralmente uma consoante e uma vogal ("yu"), portanto, pertence ao grupo consonantal para seus propósitos.

A letra "h" representa uma parada gótica (uma consoante) em francês e em palavras francesas usadas em inglês. Você pode fazer uma lista deles (na verdade, incluindo "honra", "honra" e "hora" pode ser suficiente) e contá-los como começando com vogais (já que o inglês não reconhece uma parada glótica).

Também conte "eu" como consoante etc.

Não é muito difícil.

Andrew J. Brehm
fonte
0

a escolha de um ou um depende da forma como a palavra é pronunciada. Ao olhar para a palavra, você não pode dizer necessariamente sua pronúncia correta, por exemplo, um jargão ou abreviação, etc. Uma das maneiras pode ser ter um dicionário com suporte para fonemas e usar as informações do fonema associadas à palavra para determinar se um "a "ou um" um "deve ser usado.

Rohin
fonte
0

Não posso ter certeza de que contém as informações adequadas para diferenciar "um" de "uma", mas WordNet de Princeton banco de dados existe precisamente para o propósito de tipos de tarefas semelhantes, então acho que é provável que os dados estejam lá . Possui algumas dezenas de milhares de palavras e centenas de milhares de relações entre as palavras ditas (IIRC; não consigo encontrar as estatísticas atuais no site). Dê uma olhada. Pode ser baixado gratuitamente.

rmeador
fonte
0

Quão? Que tal quando? Obtenha o substantivo com o artigo anexado. Solicite em formulário específico.

Peça o substantivo com o artigo. Muitos códigos de base do MUD armazenam itens como informações que consistem em:

  • uma ou mais palavras-chave
  • uma forma curta
  • um formulário longo

A forma da palavra-chave pode ser "espada curta enferrujada". A forma abreviada será "uma espada". A forma longa será "uma espada curta enferrujada".

Você está escrevendo um serviço da Web "a vs. um"? Dê um passo para trás e veja se você pode atacar esse vazamento mais a montante. Você pode construir uma barragem, mas, a menos que a impeça de fluir, ela acabará transbordando.

Determine o quão crítico isso é e, como outros sugeriram, opte por "rápido, mas bruto" ou "caro, mas resistente".

maxwellb
fonte
0

A regra é muito simples. Se a próxima palavra começar com o som de uma vogal, use 'an'; se começar com uma consoante, use 'a'. O difícil é que nossa classificação escolar de vogais e consoantes não funciona. O 'h' em 'honra' é uma vogal, mas o 'h' em 'hospital' é uma consoante.

Pior ainda, algumas palavras como 'honesto' começam com uma vogal ou consoante, dependendo de quem as está dizendo. Pior ainda, algumas palavras mudam dependendo das palavras ao seu redor para alguns falantes.

O problema é limitado apenas por quanto tempo e esforço você deseja dedicar a ele. Você pode escrever algo em um casal usando 'aeiou' como vogais em alguns minutos, ou pode passar meses fazendo análises linguísticas do seu público-alvo. Entre eles há um grande número de heurísticas que serão certas para alguns falantes e erradas para outros - mas como diferentes falantes têm diferentes determinações para a mesma palavra, simplesmente não é possível estar certo o tempo todo, não importa como você faça isto.

KayEss
fonte
0

A abordagem ideal seria encontrar um lugar online que possa fornecer as respostas, consultá-las dinamicamente e armazenar as respostas em cache. Você pode preparar o sistema com algumas centenas de palavras para começar.

(Não conheço essa fonte online, mas não ficaria surpreso se houvesse uma.)

Hot Licks
fonte
0

Portanto, uma solução razoável é possível sem baixar toda a Internet. Aqui está o que eu fiz:

Lembrei-me de que o Google publicou seus dados brutos para as frequências N-Gram do Google Livros aqui . Então baixei os arquivos de 2 gramas para "a_" e "an". São cerca de 26 shows, se bem me lembro. A partir disso, produzi uma lista de cadeias de caracteres em que eram precedidas de maneira esmagadora pelo artigo oposto que você esperaria (se esperássemos que as vogais recebessem um "an"). Essa lista final de palavras que consegui armazenar em menos de 7 kilobytes.

IngisKahn
fonte
-2

Você usa "a" sempre que a próxima palavra não é uma vogal? E você usa "an" sempre que houver uma vogal?

Com isso dito, você não poderia simplesmente fazer uma expressão regular como "a \ s [a, e, i, o, u]. *"? Em seguida, substitua-o por um "um?"

Daniel
fonte
Não, porque a regra é sobre sons de vogais , não letras de vogais . "Usuário" começa com uma vogal, mas a pronúncia não.
Joris Groosman