Bir kelimenin önüne "a" ve "an" ile nasıl doğru bir şekilde önek olabilirim?


94

Bir isim verildiğinde, o kelimenin "a" veya "an" ile doğru şekilde önekini almasını istediğim bir .NET uygulamam var. Bunu nasıl yaparım?

Cevabın basitçe ilk harfin sesli olup olmadığını kontrol etmek olduğunu düşünmeden önce, aşağıdaki gibi cümleleri düşünün:

  • dürüst bir hata
  • kullanılmış bir araba

4
Ayrıca, "a" veya "bir" NHL gibi "bir" gibi "bir" NHL "üzerinde bazı kafa karışıklıklarına yol açabilecek kısaltmaları da göz önünde bulundurmalısınız, bu da bir harfin sesinin bir sesli harfle başladığı, ancak kısaltma böyle bir kelime olarak telaffuz edilemiyorsa "NAS cihazı" veya "NASCAR etkinliği" olarak
JB King

5
Ayrıca, a veya an kullanımının, konuşulan çeşitli İngilizcede belirli telaffuza bağlı olabileceğini unutmayın. Herb'ün İngiliz ve Amerikan telaffuzu böyle bir örnektir.
Eric

12
@Eric: Gerçekten, bunun en sevdiğim örneği (nerdy de) "SQL". Bazıları "SQL" harflerini söyler, bazıları "devamı" kelimesi gibi telaffuz eder. Her biri farklı bir "a" veya "bir" alır. örneğin "bir devam ifadesi" ayetler "bir SQL ifadesi"
Binary Worrier

Daha da zor olanı, fikirlerin aynı İngilizce lehçesi içinde bile farklılık göstermesidir! Örneğin, resmi (İngiltere) İngilizcesi bize "otel" in doğru yapı olduğunu söyler, ancak çoğu insan günlük konuşmada "otel" kullanır. Bir tane yazarsan, geri kalanımız için çok faydalı olur!
h4xxr

Ah ... "aday H". Onunla ilk karşılaşmamı canlı bir şekilde hatırlıyorum. "An Historical Society" adlı ikinci sınıf sosyal bilgiler kitabı, sömürge Williamsburg üzerine bir kitap.
Bob Kaufman

Yanıtlar:


137
  1. Wikipedia'yı indirin
  2. Dosyayı açın ve yalnızca makale metnini çıkaran hızlı bir filtre programı yazın (indirme, makale dışı meta verilerle birlikte genellikle XML biçimindedir).
  3. A (n) .... 'nin tüm örneklerini bulun ve aşağıdaki sözcük ve tüm önekleri için bir dizin oluşturun (bunun için basit bir sonek kullanabilirsiniz). Bu, büyük / küçük harfe duyarlı olmalıdır ve maksimum kelime uzunluğuna ihtiyacınız olacak - 15 harf?
  4. (isteğe bağlı) 5 defadan daha az ortaya çıkan veya "a" ile "an" ın 2/3'ten daha az çoğunluğa ulaştığı (veya diğer bazı eşikleri - burada ince ayar yapın) tüm önekleri atın. Köşe durumlardan kaçınmak için tercihen boş ön eki saklayın.
  5. Önek veritabanınızı, ebeveyni aynı "a" veya "bir" ek açıklamayı paylaşan tüm önekleri atarak optimize edebilirsiniz.
  6. "A" veya "AN" kullanılıp kullanılmayacağına karar verirken, en uzun eşleşen öneki bulun ve öncülüğünü takip edin. 4. adımda boş öneki atmadıysanız, her zaman eşleşen bir önek (yani boş önek) olacaktır, aksi takdirde tamamen eşleşmeyen bir dize için özel bir duruma ihtiyacınız olabilir (bu tür giriş çok nadir olmalıdır) .

Muhtemelen bundan daha iyisini elde edemezsiniz - ve kesinlikle çoğu kurala dayalı sistemi yenecektir.

Düzenleme: Bunu JS / C # 'da uyguladım . Sen olabilir tarayıcınızda denemek , ya da kullandığı küçük, yeniden kullanılabilir javascript uygulaması indirin. .NET uygulaması AvsAnnuget üzerindeki pakettir . Uygulamalar önemsizdir, bu nedenle gerekirse başka bir dile aktarılması kolay olmalıdır.

"Kuralların" düşündüğümden biraz daha karmaşık olduğu ortaya çıktı:

  • öyle bir beklenmeyen sonuç ama öyle bir ittifak oyu
  • öyle bir dürüst karar ama bir hanımeli çalı
  • Semboller: Bu bir 0800 numarası veya bir ∞ kekik.
  • Kısaltmalar: Bir NASA bilimcisi, ancak bir NSA analisti; bir FIAT arabası ancak bir FAA politikası.

... bu da kural tabanlı bir sistem kurmanın zor olacağının altını çiziyor!


Ve bu çıktıda bir isim eksikse, kesinlikle basit kural motoruna geri dönebilirsiniz.
John Fisher

27
Wikipedia indirmesinin (şu anda) 2,8 Terabayta kadar açıldığı göz önüne alındığında, bu yöntemi kullanan herhangi birinin elde edilen verileri kamuya açık olarak yayınlaması harika olur, böylece işlem çok fazla tekrarlanmasına gerek kalmaz.
Nathan Long

10
Bu cevap tamamen ciddi değildi, ancak bunun gibi bir şey yaptım ve wikipedia'nın ham wikimarkup içeren .xml dosyası sadece 40GB düzeninde (en yenisi her zaman biraz daha büyüktür), 2.8TB değil - hepsi tek bir dosyada - genişletilmiş .html sürümünü veya herhangi bir resmi indirmeyin, belki 2.8 TB olan sürüm budur? Her durumda, işaretleme konusunda seçici olmadığınız sürece ayrıştırmak oldukça mümkündür.
Eamon Nerbonne

1
Aklıma gelen, kolayca elde edilebilen, güncel, doğal dil veri kümelerinin en büyüğü. Bununla birlikte, herhangi bir ek veri kaynağı da elbette iyidir - sonuçta algoritma Wikipedia'ya bağlı değildir. Sen online uygulanmasını deneyebilirsiniz home.nerbonne.org/A-vs-An ya bloguma
Eamon Nerbonne

1
Ben edildi ötesinde bu çözüm etkiledi. Dürüst olmak gerekirse, Wikipedia'yı bütünüyle indirmekten çok daha kolay olacağını düşündüm . Aferin efendim. +1
Kehlan Krumme

15

Bir istisna listesi kullanmanız gerekir. Tüm istisnaların iyi tanımlandığını sanmıyorum çünkü bazen kelimeyi söyleyen kişinin aksanına bağlıdır.

Aptalca bir yol, Google'a iki olasılığı sormak (arama API'lerinden birini kullanarak) ve en popüler olanı kullanmaktır:

Veya:

Bu nedenle "Avrupa" ve "dürüst" doğru versiyonlardır.


6
Buna gerçekten izin veriliyor mu yoksa bu yasaklanmak mı istiyor? Düzenli olarak bu tür kullanım, IIRC'ye kesinlikle hoş karşılanmaz.
Eamon Nerbonne

1
@Eamon: İlginç bir nokta. Ya uygulama, daha önce Google'da aradığı tüm kelimelerin kaydını tutuyorsa, bu yüzden karşılaştığı her yeni kelime için yalnızca bir kez Google'da arama yapmak zorunda kalırsa? Bu yine de Google'ın şüpheli kullanımı olur mu?
gnovice

2
Bariz teknik zorlukların yanı sıra (bunun gibi otomatik bir şekilde bir arama motoru çıktısının kullanımına izin verilmez ve oldukça hızlı bir şekilde engellenecektir), bu sorunu doğru bir şekilde çözmez - en kötüsü, yaygın kötüye kullanımı kopyalar. sözdizimi.
Guss

6
En kötüsü? "Yaygın kötüye kullanımın" kopyalanmasının, doğal bir dil sisteminin tam olarak çabalaması gerektiği konusunda oldukça güçlü bir argüman var. David Foster Wallace'ın Consider the Lobster'daki "Authority and American Usage" adlı makalesine bakın . Google'dan daha iyi bir kurum var, ancak bu farklı bir konu.
Robert Rossney

2
"bir otel" ve "bir kadın kahraman" bana doğru geliyor. Sanırım hafif bir cockney aksanı perspektifinden geliyorsun. Farklı aksanlar, bu kelimelerin bazılarına doğru cevap olmadığı anlamına gelir.
rjmunro

15

Sözcük telaffuzları için bir kelime yazım kaynağı bulabilirseniz, örneğin:

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

Kararınızı, yazılan telaffuz dizisinin ilk karakterine dayandırabilirsiniz. Performans için, belki de istisna kümelerini önceden oluşturmak için böyle bir arama kullanabilir ve bunun yerine yürütme sırasında bu küçük arama kümelerini kullanabilirsiniz.

Eklemek için düzenlendi:

!!! - İstisnalarınızı oluşturmak için bunu kullanabileceğinizi düşünüyorum: http://www.speech.cs.cmu.edu/cgi-bin/cmudict

Elbette her şey sözlükte olmayacak - yani her olası istisna, istisna kümelerinizde ortaya çıkmayacaktır - ancak bu durumda, varsayılan olarak ünlüler için / ünsüzler için varsayılan olarak veya daha iyi olasılıklarla başka bir sezgisel kullanabilirsiniz.

(CMU sözlüğüne baktığımda, ülkeler ve diğer bazı yerler için özel isimler içerdiğini görmekten memnun oldum - bu yüzden "Ukraynalı", "USA Today gazetesi", "Urallardan esinlenilmiş bir resim" gibi örnekler verecek.)

Eklemek için bir kez daha düzenleme: CMU sözlüğü genel kısaltmalar içermez ve s, f, l, m, n, u ve x ile başlayanlar için endişelenmeniz gerekir. Ancak Wikipedia'da olduğu gibi istisnalara eklemek için kullanabileceğiniz pek çok kısaltma listesi var.


2
Kendime engel olamıyorum ama hawr-uh-buhlbeni her zaman güldürür.
IllidanS4,

9

Manuel olarak uygulamanız ve istediğiniz istisnaları eklemeniz gerekir, örneğin ilk harf 'H' ve ardından 'O' gibi dürüst, saat ... ve ayrıca avrupa, üniversite, kullanılan ...


1
evet gerçek adam. Sanırım bu konuda yanılmışım. Hiçbir kuralı yok
Ahmad Farid

8

"A" ve "an" fonetik kurallar tarafından belirlendiğinden ve yazım kurallarına göre belirlenmediğinden, muhtemelen şöyle yapardım:

  1. Sözcüğün ilk harfi ünsüz ise -> 'a'
  2. Sözcüğün ilk harfi sesli ise-> 'an'
  3. Rjumnro'nun dediği gibi istisnaların bir listesini (kalp, röntgen, ev) tutun .

5

Belirsiz makaleler için gramer kurallarına bakmanız gerekir (İngilizce dilbilgisinde yalnızca iki belirsiz makale vardır - "a" ve "an). Bu seslerin doğru olduğunu kabul etmeyebilirsiniz, ancak İngilizce gramer kuralları çok açıktır :

"A ve an sözcükleri belirsiz makalelerdir. Bir sesli harfle (a, e, i, o, u) başlayan sözcüklerden önce belirsiz makale ve ünsüz bir sesle başlayan sözcüklerden önce (tümü diğer harfler). "

Bu demektir ki bir sesli harf Not sesi değil, bir sesli harf harf . Örneğin, "namus" veya "varis" gibi sessiz bir "h" ile başlayan sözcükler ünlü olarak kabul edilir ve bu nedenle "bir" ile devam ettirilir - örneğin, "Sizinle tanışmak bir onurdur". Bir ünsüz sesle başlayan kelimelerin önüne bir ön ek gelir - bu yüzden "kullanılmış araba" yerine "kullanılmış araba" diyorsunuz - çünkü "kullanılmış" kelimesi "uhh" sesinden çok "yoose" sesine sahiptir.

Yani, bir programcı olarak uyulması gereken kurallar bunlardır. Bir kelimenin hangi harfle değil, hangi sesle başladığını belirlemenin bir yolunu bulmanız yeterlidir. Bunun örneklerini PHP'de Jaimie Sirovich'in yazdığı gibi gördüm :

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'; 
}

Muhtemelen en kolayı kuralı oluşturmak ve ardından bir istisnalar listesi oluşturmak ve bunu kullanmak. O kadar çok olacağını sanmıyorum.


4

Dostum, bunun muhtemelen yerleşik bir argüman olduğunun farkındayım, ancak Wikipedia'dan en iyi ihtimalle yerel dilbilgisini türetecek olan ad hoc gramer kurallarını kullanmaktan daha kolay çözülebileceğini düşünüyorum.

Görünüşe göre en iyi çözüm, a veya bir tetikleyicinin kullanılması, aşağıdaki kelimenin fonem temelli eşleşmesi, belirli fonemlerin her zaman "an" ile ilişkili ve geri kalanı "a" ya ait olmasıdır.

Carnegie Mellon Üniversitesi, bu tür kontroller için harika bir çevrimiçi araca sahiptir - http://www.speech.cs.cmu.edu/cgi-bin/cmudict - ve eşleşen 39 fonem ile 125.000 kelimede. Bir kelimeyi eklemek, sadece ilkinin önemli olduğu tüm fonemik seti sağlar.

Sözcük sözlükte "NSA" gibi görünmüyorsa ve tümü büyük harfle yazılmışsa, sistem sözcüğün bir Kısaltma olduğunu varsayabilir ve aynı orijinal kural kümesine göre hangi belirsiz makalenin kullanılacağını belirlemek için ilk harfi kullanabilir.


1
Kaynak ekonomisi açısından, bu en iyi cevap ve bunun neden önerilen veri yoğun yöntemlerden çok daha kötü performans gösterdiğini anlamıyorum.
Chthonic Project

3

@Nathan Long: Wikipedia indirmek aslında kötü bir fikir değil. Tüm resimler, videolar ve diğer medyaya ihtiyaç yoktur.

Tüm İsveç wikipedia'sını (ya da en azından matematikle ilgili makaleden ulaşılabilen tüm makaleleri, örümceğimin başlangıcı olan) okumak için php ve javascript'te (!) Bir (berbat) program yazdım.

Tüm kelimeleri ve iç bağlantıları bir veritabanında topladım ve ayrıca her kelimenin sıklığını takip ettim. Şimdi bunu çeşitli görevler için bir kelime veritabanı olarak kullanıyorum: * Belirli bir harf kümesinden oluşturulabilen tüm kelimeleri bulmak (joker karakter dahil) * İsveççe için basit bir sözdizimi dosyası oluşturuldu (veritabanında bulunmayan tüm kelimeler yanlış kabul edilir).

Oh, ve tüm wikinin indirilmesi yaklaşık bir hafta sürdü, dizüstü bilgisayarım çoğu zaman 10 Mbit bağlantı ile çalışıyordu.

Oradayken, İngilizce ile tutarsız olan tüm olayları günlüğe kaydedin ve bazılarının hata olup olmadığını görün. Onları düzelt ve topluluğa bir şeyler ver.


2

Grammar Girl, A Versus An bölümünde belirttiği gibi, Amerikan ve İngiliz lehçeleri arasında farklılıklar olduğunu unutmayın .

Bir karışıklık, İngiliz ve Amerikan İngilizcesinde kelimelerin farklı telaffuz edilmesidir. Örneğin, belirli bir bitki türü için kullanılan sözcük Amerikan İngilizcesinde "erb" ve İngiliz İngilizcesinde "ot" olarak telaffuz edilir. Bunun bir sorun olduğu ender durumlarda, ülkenizde veya okuyucularınızın çoğunluğu tarafından beklenecek formu kullanın.




1

Normal alfabemizde yazılan sözcükleri ve Uluslararası Fenetik Alfabesini saklayan bir İngilizce sözlük alabilir misin ?

Daha sonra kelimenin başlangıç ​​sesini anlamak için fenetikleri kullanın ve dolayısıyla "a" veya "an" ın uygun olup olmadığını?

Bunun istatistiksel Wikipedia yaklaşımından daha kolay mı (veya daha eğlenceli) olacağından emin değilim.


0

Elimden geldiğince fazlasını kapsayacak şekilde kural tabanlı bir algoritma kullanırdım, ardından bir istisna listesi kullanırdım. Süslü olmak istiyorsanız, istisna listenizden bazı yeni "kurallar" belirlemeyi deneyebilirsiniz.


0

Ben sadece bir sezgisel taramaya benziyorum. Biraz daha karmaşık olması ve hiç iyi bir cevabını alamadığım bazı şeylere cevap vermesi gerekiyor, örneğin kısaltmaları nasıl ele alıyorsunuz ("bir RPM" veya "bir RPM"? Her zaman ikincisinin daha mantıklı olduğunu düşündüm).

Hızlı bir arama, İngilizce tekil önekin nasıl kullanılacağından bahseden dilbilimsel kitaplıklarda sonuç verdi, ancak yeterince derin kazarsan muhtemelen bir şeyler bulabilirsin. Ve değilse - her zaman kendi çekim kitaplığınızı yazabilir ve dünya şöhreti kazanabilirsiniz :-).


RPM gibi kısaltmalar sorun değildir. Dediğin gibi her iki şekilde de tedavi edilebilirler. Dolayısıyla çözüm açıktır: onları görmezden gelin.
Andrew J. Brehm

Kabul etmiyorum çünkü bu tutarsız öneklere neden oluyor. Bunu görmezden gelmek, açıkça yanlış olan "RPM" ve "UGC" ye neden olur.
Guss

0

"A / an" gibi bazı kazan tabağı malzemelerini tek adımda kapsayacak şekilde doldurabileceğinizi sanmıyorum. Aksi takdirde, 'h' olan tüm kelimeler gibi varsayım hatalarıyla sonuçlanırsınız, 'a' gibi 'ev' yerine 'o' ile devam edin 'an' - (ev?) Temel olarak, İngiliz dilinin mantığını dahil edeceksiniz veya ara sıra sizi aptal gösterecek nadir durumlar bulacaksınız.


0

Bir kelimenin sesli mi yoksa ünsüz mü başladığını kontrol edin. Bir "u" genellikle bir ünsüz ve bir sesli harftir ("yu"), dolayısıyla amaçlarınız doğrultusunda ünsüz grubuna aittir.

"H" harfi, Fransızca'da ve İngilizce'de kullanılan Fransızca sözcüklerde bir durma (ünsüz) anlamına gelir. Bunların bir listesini yapabilir (aslında "şeref", "şeref" ve "saat" de dahil olmak üzere yeterli olabilir) ve bunları ünlülerle başlayan olarak sayabilirsiniz (çünkü İngilizce glottal duruşu tanımaz).

Ayrıca "eu" harfini ünsüz olarak sayın vs.

Çok zor değil.


0

a veya a seçimi, kelimenin telaffuz edilme şekline bağlıdır. Kelimeye bakarak doğru telaffuzunu (örneğin bir Jargon veya kısaltma vb.) Söyleyemezsiniz. Yollardan biri, fonemleri destekleyen bir sözlüğe sahip olmak ve bir "a" olup olmadığını belirlemek için kelimeyle ilişkili fonem bilgilerini kullanmak olabilir. "veya" bir "kullanılmalıdır.


0

İçinde "a" ve "bir" yi ayırt etmek için uygun bilgilere sahip olduğundan emin olamıyorum, ancak Princeton'ın WordNet veritabanı tam olarak benzer türdeki görevler için var, bu yüzden verilerin büyük olasılıkla orada olduğunu düşünüyorum . On binlerce kelime ve söz konusu kelimeler arasında yüz binlerce ilişki vardır (IIRC; sitede güncel istatistikleri bulamıyorum). Bir göz atın. Ücretsiz olarak indirilebilir.


0

Nasıl? Peki ne zaman? Ekli makale ile ismi alın. Belirli bir biçimde isteyin.

Makaleyle birlikte ismi isteyin. Çoğu MUD kod tabanı, öğeleri aşağıdakilerden oluşan bilgiler olarak depolar:

  • bir veya daha fazla anahtar kelime
  • kısa bir form
  • uzun bir form

Anahtar kelime formu "paslı kısa kılıç" olabilir. Kısa biçim "kılıç" olacaktır. Uzun biçim "paslı bir kısa kılıç" olacaktır.

Bir "a ve bir" Web hizmeti mi yazıyorsunuz? Bir adım geri atın ve bu sızıntıya daha ileri akışta saldırıp saldıramayacağınıza bakın. Bir baraj inşa edebilirsiniz, ancak akmasını durdurmazsanız, eninde sonunda taşacaktır.

Bunun ne kadar kritik olduğunu belirleyin ve diğerlerinin önerdiği gibi, "hızlı ama kaba" veya "pahalı ama sağlam" seçeneklerine gidin.


0

Kural çok basit. Bir sonraki kelime sesli bir sesle başlıyorsa, 'an' kullanın, bir ünsüzle başlıyorsa 'a' kullanın. Zor olan, okuldaki ünlüler ve ünsüzler sınıflandırmamızın işe yaramamasıdır. "Onur" daki "h" bir ünlüdür, ancak "hastane" deki "h" bir ünsüzdür.

Daha da kötüsü, 'dürüst' gibi bazı kelimeler, kimin söylediğine bağlı olarak bir sesli veya sessiz harfle başlar. Daha da kötüsü, bazı konuşmacılar için bazı kelimeler çevrelerindeki kelimelere göre değişir.

Sorun, yalnızca ona ne kadar zaman ve çaba harcamak istediğinizle sınırlıdır. Birkaç dakika içinde 'aeiou' harfini sesli harf olarak kullanarak bir çift halinde bir şeyler yazabilir veya hedef kitlenizin dilbilimsel analizini yapmak için aylar harcayabilirsiniz. Bunların arasında, bazı konuşmacılar için doğru ve diğerleri için yanlış olacak çok sayıda buluşsal yöntem vardır - ancak farklı konuşmacıların aynı kelime için farklı belirlemeleri olduğundan, nasıl yaparsanız yapın, her zaman haklı olmak mümkün değildir. o.


0

İdeal yaklaşım, size cevapları verebilecek, bunları dinamik olarak sorgulayabilecek ve cevapları önbelleğe alabilecek çevrimiçi bir yer bulmak olacaktır. Yeni başlayanlar için sistemi birkaç yüz kelime ile hazırlayabilirsiniz.

(Böyle bir çevrimiçi kaynak bilmiyorum, ama varsa şaşırmam.)


0

Yani, internetin tamamını indirmeden makul bir çözüm mümkündür. İşte yaptığım şey:

Google'ın, Google Books N-Gram frekansları için ham verilerini burada yayınladığını hatırladım . Bu yüzden "a_" ve "an" için 2 gramlık dosyaları indirdim. Doğru hatırlıyorsam yaklaşık 26 konser. Bundan büyük bir çoğunlukla beklediğiniz karşıt makaleden önce gelen dizelerin bir listesini çıkardım (eğer sesli harflerin bir "an" almasını beklersek). 7 kilobayttan daha az depolayabildiğim son kelime listesi.


-2

Sonraki kelime sesli harf olmadığında "a" mı kullanıyorsun? Ve sesli harf olduğu zaman "an" mı kullanıyorsun?

Bununla birlikte, "a \ s [a, e, i, o, u]. *" Gibi bir normal ifade yapamaz mısın? Ve sonra onu "an" ile değiştir


Hayır, kural sesli ilgili olduğu için sesler değil, sesli harf harf . "Kullanıcı" bir sesli harfle başlar, ancak telaffuz değil.
Joris Groosman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.