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
c#
nlp
linguistics
ryeguy
sumber
sumber
Jawaban:
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
AvsAn
di nuget . Implementasinya sepele, jadi mudah untuk melakukan port ke bahasa lain jika perlu.Ternyata "aturan" ini sedikit lebih rumit dari yang saya kira:
... yang hanya menggarisbawahi bahwa sistem berbasis aturan akan sulit untuk dibuat!
sumber
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.
sumber
Jika Anda bisa menemukan sumber ejaan kata untuk pengucapan kata, seperti:
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.
sumber
hawr-uh-buhl
selalu membuatku tertawa.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 ...
sumber
Karena "a" dan "an" ditentukan oleh aturan fonetik dan bukan konvensi ejaan, saya mungkin akan melakukannya seperti ini:
sumber
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 :
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:
Mungkin yang paling mudah untuk membuat aturan dan kemudian membuat daftar pengecualian dan menggunakannya. Saya tidak membayangkan akan ada sebanyak itu.
sumber
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.
sumber
@ 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.
sumber
Perhatikan bahwa ada perbedaan antara dialek Amerika dan Inggris, seperti yang ditunjukkan Grammar Girl dalam episode A Versus An-nya .
sumber
Lihatlah Perl's Lingua :: EN :: Inflect . Lihat
sub _indef_article
di kode sumber.sumber
Saya telah mem-porting sebuah fungsi dari Python (aslinya dari paket CPAN Lingua-EN-Inflect) yang dengan benar menentukan suara vokal di C # dan mempostingnya sebagai jawaban atas pertanyaan secara terprogram menentukan apakah akan mendeskripsikan objek dengan a atau an? . Anda dapat melihat cuplikan kodenya di sini .
sumber
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.
sumber
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.
sumber
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 :-).
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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:
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".
sumber
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.
sumber
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.)
sumber
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.
sumber
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?"
sumber