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
c#
nlp
linguistics
Ryeguy
fonte
fonte
Respostas:
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
AvsAn
em 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:
... o que apenas sublinha que um sistema baseado em regras seria complicado de construir!
fonte
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.
fonte
Se você pudesse encontrar uma fonte de grafia de palavras para pronúncias de palavras, como:
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.
fonte
hawr-uh-buhl
sempre me faz rir.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 ...
fonte
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:
fonte
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 :
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:
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.
fonte
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.
fonte
@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.
fonte
Observe que há diferenças entre os dialetos americanos e britânicos, como Grammar Girl apontou em seu episódio A Versus An .
fonte
Dê uma olhada em Lingua :: EN :: Inflect do Perl . Veja
sub _indef_article
no código fonte.fonte
Transformei uma função do Python (originalmente do pacote CPAN Lingua-EN-Inflect) que determina corretamente os sons das vogais em C # e a postei como uma resposta à pergunta Determinar programaticamente se deve descrever um objeto com um ou um? . Você pode ver o snippet de código aqui .
fonte
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.
fonte
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.
fonte
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 :-).
fonte
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
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.
fonte
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.
fonte
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.
fonte
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:
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".
fonte
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.
fonte
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.)
fonte
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.
fonte
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?"
fonte