Bagaimana saya bisa mengawali kata dengan "a" dan "an" dengan benar?


93

Saya memiliki aplikasi .NET di mana, diberi kata benda, saya ingin kata itu diawali dengan benar dengan "a" atau "an". Bagaimana saya melakukannya?

Sebelum Anda berpikir jawabannya adalah dengan memeriksa apakah huruf pertama adalah huruf vokal, pertimbangkan frasa seperti:

  • kesalahan yang jujur
  • mobil bekas

4
Anda juga harus mempertimbangkan singkatan yang juga dapat menyebabkan beberapa kebingungan pada "a" atau "an" seperti "sebuah NHL" yang juga memunculkan bunyi huruf yang dimulai dengan vokal meskipun tidak jika singkatan tersebut dapat diucapkan seperti kata seperti itu. sebagai "perangkat NAS" atau "acara NASCAR"
JB King

5
Juga perlu diingat bahwa penggunaan a atau an dapat bergantung pada pengucapan tertentu dalam variasi bahasa Inggris yang digunakan. Pengucapan ramuan Inggris dan Amerika adalah salah satu contohnya.
Eric

12
@Eric: Memang, contoh favorit saya (juga kutu buku) adalah "SQL". Beberapa orang mengucapkan huruf "SQL", beberapa orang mengucapkannya seperti kata "sekuel". Masing-masing mendapat "a" atau "an" yang berbeda. misalnya "pernyataan sekuel" ayat "ini adalah pernyataan SQL"
Binary Worrier

Yang lebih sulit lagi adalah bahwa pendapat berbeda dalam dialek bahasa Inggris yang sama! Misalnya, bahasa Inggris resmi (Inggris Raya) memberi tahu kita "hotel" adalah struktur yang benar, tetapi kebanyakan orang akan menggunakan "hotel" dalam percakapan sehari-hari. Jika Anda menulisnya, itu akan sangat berguna bagi kita semua!
h4xxr

Ah ... "calon H". Saya ingat dengan jelas pertemuan pertama saya dengannya. Sebuah buku studi sosial kelas dua berjudul "An Historical Society", sebuah buku tentang kolonial Williamsburg.
Bob Kaufman

Jawaban:


137
  1. Unduh Wikipedia
  2. Buka zip dan tulis program filter cepat yang hanya menampilkan teks artikel (unduhan umumnya dalam format XML, bersama dengan metadata non-artikel juga).
  3. Temukan semua contoh a (n) .... dan buat indeks pada kata berikut dan semua awalannya (Anda dapat menggunakan sufiks sederhana untuk ini). Ini harus peka huruf besar / kecil, dan Anda memerlukan panjang kata maksimum - 15 huruf?
  4. (opsional) Buang semua prefiks yang muncul kurang dari 5 kali atau di mana "a" vs. "an" mencapai mayoritas kurang dari 2/3 (atau ambang batas lainnya - sesuaikan di sini). Sebaiknya simpan awalan kosong untuk menghindari kasus sudut.
  5. Anda dapat mengoptimalkan database prefiks Anda dengan membuang semua prefiks yang induknya memiliki anotasi "a" atau "an" yang sama.
  6. Saat menentukan apakah akan menggunakan "A" atau "AN" temukan awalan pencocokan terpanjang, dan ikuti petunjuknya. Jika Anda tidak membuang awalan kosong di langkah 4, maka akan selalu ada awalan yang cocok (yaitu awalan kosong), jika tidak, Anda mungkin memerlukan kasus khusus untuk string yang sama sekali tidak cocok (masukan seperti itu harus sangat jarang) .

Anda mungkin tidak bisa menjadi lebih baik dari ini - dan itu pasti akan mengalahkan kebanyakan sistem berbasis aturan.

Edit: Saya telah menerapkan ini di JS / C # . Anda dapat mencobanya di browser Anda , atau mendownload implementasi javascript kecil yang dapat digunakan kembali yang digunakannya. Implementasi .NET adalah paket AvsAndi nuget . Implementasinya sepele, jadi mudah untuk melakukan port ke bahasa lain jika perlu.

Ternyata "aturan" ini sedikit lebih rumit dari yang saya kira:

  • itu merupakan hasil yang tak terduga tapi itu sebuah suara bulat
  • itu sebuah keputusan yang jujur tapi sebuah semak honeysuckle
  • Simbol: Ini merupakan nomor 0800, atau sebuah ∞ oregano.
  • Akronim: Ini merupakan ilmuwan NASA, tapi seorang analis NSA; sebuah mobil FIAT tapi suatu kebijakan FAA.

... yang hanya menggarisbawahi bahwa sistem berbasis aturan akan sulit untuk dibuat!


Dan jika kata benda hilang dari keluaran ini, Anda pasti dapat kembali ke mesin aturan sederhana.
John Fisher

26
Mengingat bahwa unduhan Wikipedia terdekompresi menjadi (saat ini) 2,8 Terabyte, akan sangat bagus jika siapa pun yang menggunakan metode ini akan memposting data yang dihasilkan secara publik sehingga prosesnya tidak perlu banyak diulang.
Nathan Long

10
Jawaban ini tidak sepenuhnya serius, tetapi saya telah melakukan sesuatu seperti ini, dan file .xml wikipedia dengan wikimarkup mentah hanya di urutan 40GB (yang terbaru selalu sedikit lebih besar), bukan 2,8TB - semua dalam satu file - jangan mengunduh versi .html yang diperluas atau gambar apa pun, mungkin itu adalah versi 2,8 TB? Bagaimanapun, sebenarnya cukup layak untuk diurai, selama Anda tidak pilih-pilih tentang markup.
Eamon Nerbonne

1
Ini adalah salah satu kumpulan data bahasa alami terbesar yang tersedia dengan mudah, terkini yang dapat saya pikirkan. Namun, sumber data tambahan apa pun juga boleh, tentu saja - algoritme tidak bergantung pada wikipedia. Anda dapat mencoba penerapan online di home.nerbonne.org/A-vs-An atau blog saya
Eamon Nerbonne

1
Saya melampaui terkesan dengan solusi ini. Sejujurnya saya pikir itu akan jauh lebih sederhana daripada mengunduh Wikipedia secara keseluruhan. Bagus, Pak. +1
Kehlan Krumme

15

Anda perlu menggunakan daftar pengecualian. Menurut saya semua pengecualian tidak didefinisikan dengan baik, karena terkadang bergantung pada aksen orang yang mengucapkan kata tersebut.

Salah satu cara bodoh adalah menanyakan Google tentang dua kemungkinan (menggunakan salah satu API pencarian) dan menggunakan yang paling populer:

Atau:

Oleh karena itu "a europe" dan "an honest" adalah versi yang benar.


6
Apakah itu benar-benar penggunaan yang diizinkan atau apakah ini meminta untuk dilarang? Penggunaan seperti itu secara teratur tentu tidak disukai oleh IIRC.
Eamon Nerbonne

1
@Eamon: Hal yang menarik. Bagaimana jika aplikasi menyimpan catatan semua kata yang sebelumnya telah dicari di Google, sehingga hanya perlu mencari di Google sekali untuk setiap kata baru yang ditemukannya? Apakah itu masih menjadi penggunaan Google yang dipertanyakan?
gnovice

2
Selain dari kesulitan teknis yang jelas (penggunaan hasil mesin pencari dengan cara otomatis seperti ini tidak diperbolehkan dan akan diblokir lebih cepat), ini tidak menyelesaikan masalah dengan cara yang benar - paling buruk itu akan menduplikasi penyalahgunaan umum dari sintaksis.
Guss

6
Paling buruk? Ada argumen yang cukup kuat untuk dibuat bahwa menduplikasi "penyalahgunaan umum" adalah hal yang harus diperjuangkan oleh sistem bahasa alami. Lihat esai David Foster Wallace "Authority and American Usage", dalam Pertimbangkan Lobster . Ada korpora yang lebih baik untuk digunakan daripada Google, tapi itu masalah yang berbeda.
Robert Rossney

2
"hotel" dan "pahlawan wanita" tampaknya cocok untukku. Saya kira Anda datang dari perspektif aksen yang sedikit cockney. Aksen yang berbeda berarti tidak ada jawaban yang benar untuk beberapa kata ini.
rjmunro

15

Jika Anda bisa menemukan sumber ejaan kata untuk pengucapan kata, seperti:

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

Anda dapat mendasarkan keputusan Anda pada karakter pertama dari string pengucapan yang dieja. Untuk kinerja, mungkin Anda dapat menggunakan pencarian seperti itu untuk membuat lebih awal kumpulan pengecualian dan sebagai gantinya menggunakan kumpulan pencarian yang lebih kecil tersebut selama eksekusi.

Diedit untuk menambahkan:

!!! - Saya pikir Anda dapat menggunakan ini untuk menghasilkan pengecualian Anda: http://www.speech.cs.cmu.edu/cgi-bin/cmudict

Tidak semuanya akan ada di kamus, tentu saja - artinya tidak semua kemungkinan pengecualian akan berakhir di kumpulan pengecualian Anda - tetapi dalam hal ini, Anda bisa menggunakan huruf vokal for / a untuk konsonan atau menggunakan heuristik lain dengan peluang yang lebih baik.

(Melihat kamus CMU, saya senang melihat itu termasuk kata benda yang tepat untuk negara dan beberapa tempat lain - jadi itu akan memberikan contoh seperti "Ukraina", "kertas USA Today", "lukisan yang terinspirasi Ural".)

Mengedit sekali lagi untuk menambahkan: Kamus CMU tidak berisi akronim umum, dan Anda harus mengkhawatirkan akronim yang dimulai dengan s, f, l, m, n, u, dan x. Tetapi ada banyak daftar akronim di luar sana, seperti di Wikipedia, yang dapat Anda gunakan untuk menambahkan pengecualian.


2
Tidak bisa menahan diri, tapi hawr-uh-buhlselalu membuatku tertawa.
IllidanS4 ingin Monica kembali pada

9

Anda harus mengimplementasikan secara manual dan menambahkan pengecualian yang Anda inginkan seperti misalnya jika huruf pertama adalah 'H' dan diikuti dengan 'O' seperti jujur, jam ... dan juga sebaliknya seperti europe, university, used ...


1
ya pria sejati. Saya kira saya salah dalam hal itu. Tidak ada aturan sama sekali
Ahmad Farid

8

Karena "a" dan "an" ditentukan oleh aturan fonetik dan bukan konvensi ejaan, saya mungkin akan melakukannya seperti ini:

  1. Jika huruf pertama dari kata tersebut adalah konsonan -> 'a'
  2. Jika huruf pertama dari kata tersebut adalah vokal-> 'an'
  3. Buat daftar pengecualian (hati, x-ray, rumah) seperti yang dikatakan rjumnro .

5

Anda perlu melihat aturan tata bahasa untuk artikel tak tentu (hanya ada dua artikel tak tentu dalam tata bahasa Inggris - "a" dan "an). Anda mungkin tidak setuju ini terdengar benar, tetapi aturan tata bahasa Inggris sangat jelas :

"Kata a dan an adalah artikel tak tentu. Kami menggunakan kata sandang tak tentu an sebelum kata yang diawali dengan bunyi vokal (a, e, i, o, u) dan kata sandang tak tentu a sebelum kata yang dimulai dengan bunyi konsonan (semua huruf lain). "

Perhatikan ini berarti bunyi vokal , dan bukan huruf vokal . Misalnya, kata-kata yang diawali dengan huruf "h" yang tidak bersuara, seperti "kehormatan" atau "ahli waris" diperlakukan sebagai vokal dan dilanjutkan dengan "an" - misalnya, "Merupakan suatu kehormatan untuk bertemu dengan Anda". Kata-kata yang diawali dengan bunyi konsonan diawali dengan a - itulah mengapa Anda mengatakan "mobil bekas" daripada "mobil bekas" - karena "bekas" memiliki bunyi "yoose" daripada bunyi "uhh".

Jadi, sebagai programmer, ini adalah aturan yang harus diikuti. Anda hanya perlu mencari cara untuk menentukan suara awal sebuah kata, bukan huruf apa. Saya telah melihat contohnya, seperti ini di PHP oleh 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'; 
}

Mungkin yang paling mudah untuk membuat aturan dan kemudian membuat daftar pengecualian dan menggunakannya. Saya tidak membayangkan akan ada sebanyak itu.


4

Sobat, saya menyadari bahwa ini mungkin argumen yang sudah pasti, tetapi saya pikir itu bisa diselesaikan lebih mudah daripada menggunakan aturan tata bahasa ad hoc dari Wikipedia, yang paling-paling mendapatkan tata bahasa vernakular.

Solusi terbaik, tampaknya, adalah menggunakan a atau pemicu pencocokan berbasis fonem dari kata berikut, dengan fonem tertentu selalu dikaitkan dengan "an" dan sisanya milik "a".

Universitas Carnegie Mellon memiliki alat online yang hebat untuk pemeriksaan semacam ini - http://www.speech.cs.cmu.edu/cgi-bin/cmudict - dan dengan 125 ribu kata dengan 39 fonem yang cocok. Memasukkan kata akan menyediakan seluruh himpunan fonemik, yang terpenting hanya yang pertama.

Jika kata tersebut tidak muncul dalam kamus, seperti "NSA" dan semuanya menggunakan huruf besar, maka sistem dapat menganggap kata tersebut Akronim dan menggunakan huruf pertama untuk menentukan artikel tak tentu mana yang akan digunakan berdasarkan kumpulan aturan asli yang sama.


1
Dalam hal ekonomi sumber daya, ini adalah jawaban terbaik, dan saya tidak mengerti mengapa ini akan berkinerja lebih buruk daripada metode intensif data yang jauh lebih banyak diusulkan.
Proyek Chthonic

3

@ Nathan Long: Mengunduh wikipedia sebenarnya bukan ide yang buruk. Semua gambar, video dan media lain tidak diperlukan.

Saya menulis program (jelek) dalam php dan javascript (!) Untuk membaca seluruh wikipedia Swedia (atau setidaknya semua bahasa yang dapat dijangkau dari aricle tentang matematika, yang merupakan awal dari laba-laba saya.)

Saya mengumpulkan semua kata dan tautan internal dalam database, dan juga melacak frekuensi setiap kata. Saya sekarang menggunakannya sebagai database kata untuk berbagai tugas: * Menemukan semua kata yang dapat dibuat dari sekumpulan huruf tertentu (termasuk wildcard) * Membuat file sintaks sederhana untuk bahasa Swedia (semua kata yang tidak ada dalam database dianggap salah).

Oh, dan mengunduh seluruh wiki membutuhkan waktu sekitar satu minggu, menggunakan laptop saya hampir sepanjang waktu, dengan koneksi 10Mbit.

Saat Anda melakukannya, catat semua kejadian yang tidak sesuai dengan bahasa Inggris dan lihat apakah beberapa di antaranya adalah kesalahan. Perbaiki dan berikan sesuatu kembali ke komunitas.


2

Perhatikan bahwa ada perbedaan antara dialek Amerika dan Inggris, seperti yang ditunjukkan Grammar Girl dalam episode A Versus An-nya .

Salah satu komplikasi adalah ketika kata-kata diucapkan secara berbeda dalam bahasa Inggris British dan Amerika. Misalnya, kata untuk jenis tumbuhan tertentu diucapkan "erb" dalam bahasa Inggris Amerika dan "herb" dalam bahasa Inggris British. Dalam kasus yang jarang terjadi di mana ini menjadi masalah, gunakan formulir yang diharapkan di negara Anda atau oleh sebagian besar pembaca Anda.




1

Bisakah Anda mendapatkan kamus bahasa Inggris yang menyimpan kata-kata yang ditulis dalam alfabet biasa kami, dan Alfabet Fenisia Internasional ?

Kemudian gunakan fonetik untuk mengetahui bunyi awal kata, dan dengan demikian apakah “a” atau “an” sesuai?

Tidak yakin apakah itu akan lebih mudah daripada (atau menyenangkan seperti) pendekatan statistik Wikipedia.


0

Saya akan menggunakan algoritme berbasis aturan untuk mencakup sebanyak mungkin, lalu menggunakan daftar pengecualian. Jika Anda ingin menjadi mewah, Anda dapat mencoba menentukan beberapa "aturan" baru dari daftar pengecualian Anda.


0

Saya hanya terlihat seperti satu set heuristik. Perlu sedikit lebih rumit dan menjawab beberapa hal yang saya tidak pernah mendapat jawaban yang bagus, misalnya bagaimana Anda memperlakukan singkatan ("a RPM" atau "an RPM"? Saya selalu berpikir yang terakhir lebih masuk akal).

Pencarian cepat dihasilkan pada perpustakaan linguistik yang berbicara tentang bagaimana menangani awalan tunggal bahasa Inggris, tetapi Anda mungkin dapat menemukan sesuatu jika Anda cukup menggali. Dan jika tidak - Anda selalu dapat menulis perpustakaan infleksi Anda sendiri dan mendapatkan ketenaran dunia :-).


Singkatan seperti RPM tidak menjadi masalah. Seperti yang Anda katakan, mereka dapat diperlakukan dengan cara apa pun. Karenanya solusinya jelas: abaikan saja.
Andrew J. Brehm

Saya tidak setuju karena itu menyebabkan awalan yang tidak konsisten. Mengabaikannya akan menyebabkan "RPM" dan "UGC" yang jelas-jelas salah.
Guss

0

Saya rasa Anda tidak bisa mengisi beberapa bahan pelat ketel seperti 'a / an' sebagai penutup satu langkah. Jika tidak, Anda akan berakhir dengan kesalahan asumsi seperti semua kata dengan 'h' dilanjutkan dengan 'o' get 'an' alih-alih 'a' like 'home' - (rumah?). Pada dasarnya, Anda akan berakhir dengan logika bahasa Inggris atau sesekali menemukan kasus langka yang akan membuat Anda terlihat bodoh.


0

Periksa apakah sebuah kata dimulai dengan vokal atau konsonan. A "u" umumnya adalah konsonan dan vokal ("yu"), karena itu termasuk dalam kelompok konsonan untuk tujuan Anda.

Huruf "h" adalah singkatan dari gottal stop (konsonan) dalam bahasa Prancis dan kata Prancis digunakan dalam bahasa Inggris. Anda dapat membuat daftar itu (sebenarnya, termasuk "honor", "honor", dan "hour" mungkin cukup) dan menghitungnya sebagai dimulai dengan vokal (karena bahasa Inggris tidak mengenali perhentian glotal).

Juga hitung "eu" sebagai konsonan, dll.

Tidak terlalu sulit.


0

pilihan dari sebuah atau a tergantung pada cara kata tersebut diucapkan. Dengan melihat kata tersebut, Anda belum tentu bisa mengatakan pengucapannya yang benar, misalnya Jargon atau singkatan, dll. Salah satu caranya adalah dengan memiliki kamus yang mendukung fonem dan menggunakan informasi fonem yang terkait dengan kata tersebut untuk menentukan apakah sebuah "a "atau" an "harus digunakan.


0

Saya tidak dapat memastikan bahwa ia memiliki informasi yang sesuai di dalamnya untuk membedakan "a" dan "an", tetapi basis data WordNet Princeton ada tepat untuk tujuan jenis tugas serupa, jadi saya pikir kemungkinan datanya ada di sana . Ini memiliki beberapa puluh ribu kata dan ratusan ribu hubungan antara kata-kata (IIRC; Saya tidak dapat menemukan statistik saat ini di situs). Coba lihat. Ini dapat diunduh secara gratis.


0

Bagaimana? Bagaimana kalau kapan? Dapatkan kata benda dengan artikel terlampir. Mintalah dalam bentuk tertentu.

Mintalah kata benda dengan artikel tersebut. Banyak item penyimpanan basis kode MUD sebagai informasi yang terdiri dari:

  • satu atau lebih kata kunci
  • bentuk pendek
  • bentuk yang panjang

Bentuk kata kuncinya mungkin "pedang pendek berkarat". Bentuk pendeknya adalah "pedang". Bentuk panjangnya adalah "pedang pendek berkarat".

Apakah Anda menulis layanan Web "a vs. an"? Ambil langkah mundur dan lihat apakah Anda dapat menyerang kebocoran ini lebih jauh ke hulu. Anda bisa membangun bendungan, tetapi jika tidak dihentikan, bendungan itu pada akhirnya akan tumpah.

Tentukan seberapa kritis hal ini, dan seperti yang disarankan orang lain, pilih "cepat tapi kasar", atau "mahal tapi kokoh".


0

Aturannya sangat sederhana. Jika kata berikutnya dimulai dengan bunyi vokal maka gunakan 'an', jika diawali dengan konsonan maka gunakan 'a'. Hal yang sulit adalah klasifikasi vokal dan konsonan sekolah kami tidak berfungsi. 'H' dalam 'honor' adalah vokal, tapi 'h' di 'hospital' adalah konsonan.

Lebih buruk lagi, beberapa kata seperti 'jujur' dimulai dengan vokal atau konsonan tergantung siapa yang mengucapkannya. Lebih buruk lagi, beberapa kata berubah tergantung pada kata-kata di sekitarnya untuk beberapa pembicara.

Masalahnya hanya dibatasi oleh berapa banyak waktu dan usaha yang ingin Anda berikan untuk itu. Anda dapat menulis sesuatu dalam pasangan menggunakan 'aeiou' sebagai vokal dalam beberapa menit, atau Anda dapat menghabiskan waktu berbulan-bulan melakukan analisis linguistik dari target audiens Anda. Di antara mereka ada sejumlah besar heuristik yang akan benar untuk beberapa pembicara dan salah untuk yang lain - tetapi karena pembicara yang berbeda memiliki determinasi yang berbeda untuk kata yang sama, tidak mungkin untuk selalu benar setiap saat tidak peduli bagaimana Anda melakukannya. Itu.


0

Pendekatan yang ideal adalah menemukan tempat online yang dapat memberi Anda jawaban, menanyakannya secara dinamis dan menyimpan jawaban dalam cache. Anda dapat mengatur sistem dengan beberapa ratus kata sebagai permulaan.

(Saya tidak tahu tentang sumber online semacam itu, tetapi saya tidak akan terkejut jika ada.)


0

Jadi, solusi yang masuk akal dimungkinkan tanpa mengunduh semua internet. Inilah yang saya lakukan:

Saya ingat bahwa Google menerbitkan data mentah mereka untuk frekuensi Google Buku N-Gram di sini . Jadi saya mengunduh file 2 gram untuk "a_" dan "an". Ini tentang 26 pertunjukan jika saya ingat dengan benar. Dari situ saya menghasilkan daftar string di mana mereka sangat didahului oleh artikel berlawanan yang Anda harapkan (jika kita mengharapkan vokal mengambil "an"). Daftar kata terakhir yang bisa saya simpan di bawah 7 kilobyte.


-2

Anda menggunakan "a" setiap kali kata berikutnya bukan vokal? Dan Anda menggunakan "an" setiap kali ada vokal?

Dengan itu, tidak bisakah Anda melakukan ekspresi reguler seperti "a \ s [a, e, i, o, u]. *"? Dan kemudian menggantinya dengan "an?"


Tidak, karena aturannya adalah tentang bunyi vokal , bukan huruf vokal . "Pengguna" dimulai dengan vokal, tetapi pengucapannya tidak.
Joris Groosman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.