ฉันมีแอปพลิเคชั่น. NET ที่หากมีคำนามฉันต้องการให้มันนำหน้าคำนั้นด้วย "a" หรือ "an" อย่างถูกต้อง ฉันจะทำอย่างไร
ก่อนที่คุณจะคิดว่าคำตอบคือเพียงตรวจสอบว่าตัวอักษรตัวแรกเป็นสระหรือไม่ให้พิจารณาวลีต่างๆเช่น:
- ความผิดพลาดโดยสุจริต
- รถมือสอง
ฉันมีแอปพลิเคชั่น. NET ที่หากมีคำนามฉันต้องการให้มันนำหน้าคำนั้นด้วย "a" หรือ "an" อย่างถูกต้อง ฉันจะทำอย่างไร
ก่อนที่คุณจะคิดว่าคำตอบคือเพียงตรวจสอบว่าตัวอักษรตัวแรกเป็นสระหรือไม่ให้พิจารณาวลีต่างๆเช่น:
คำตอบ:
คุณอาจจะไม่ดีไปกว่านี้ - และแน่นอนว่ามันจะเอาชนะระบบที่อิงกฎส่วนใหญ่ได้
แก้ไข:ฉันได้ดำเนินการใน JS / C # คุณสามารถทดลองใช้ในเบราว์เซอร์ของคุณหรือดาวน์โหลดการใช้งานจาวาสคริปต์ขนาดเล็กที่ใช้ซ้ำได้ที่ใช้ การดำเนินการ NET เป็นแพคเกจAvsAn
ใน nuget การใช้งานเป็นเรื่องเล็กน้อยดังนั้นจึงควรง่ายต่อการพอร์ตไปยังภาษาอื่น ๆ หากจำเป็น
ปรากฎว่า "กฎ" ค่อนข้างซับซ้อนกว่าที่คิด:
... ซึ่งจะขีดเส้นใต้ว่าระบบที่ใช้กฎจะสร้างได้ยาก!
คุณต้องใช้รายการข้อยกเว้น ฉันไม่คิดว่าข้อยกเว้นทั้งหมดจะถูกกำหนดไว้อย่างดีเพราะบางครั้งมันก็ขึ้นอยู่กับสำเนียงของคนที่พูดคำนั้น
วิธีที่โง่อย่างหนึ่งคือขอความเป็นไปได้สองอย่างจาก Google (โดยใช้หนึ่งใน API การค้นหา) และใช้สิ่งที่เป็นที่นิยมที่สุด
หรือ:
ดังนั้น "ยุโรป" และ "ซื่อสัตย์" จึงเป็นเวอร์ชันที่ถูกต้อง
หากคุณสามารถค้นหาแหล่งที่มาของการสะกดคำเพื่อออกเสียงคำเช่น:
"honest":"on-ist"
"horrible":"hawr-uh-buhl, hor-"
คุณสามารถพิจารณาจากอักขระตัวแรกของสตริงการออกเสียงที่สะกดได้ สำหรับประสิทธิภาพบางทีคุณอาจใช้การค้นหาดังกล่าวเพื่อสร้างชุดข้อยกเว้นล่วงหน้าและใช้ชุดการค้นหาที่เล็กลงในระหว่างการดำเนินการแทน
แก้ไขเพื่อเพิ่ม:
!!! - ฉันคิดว่าคุณสามารถใช้สิ่งนี้เพื่อสร้างข้อยกเว้นของคุณ: http://www.speech.cs.cmu.edu/cgi-bin/cmudict
แน่นอนว่าไม่ใช่ทุกอย่างที่จะอยู่ในพจนานุกรม - หมายความว่าไม่มีข้อยกเว้นที่เป็นไปได้ทุกอย่างที่จะจบลงในชุดข้อยกเว้นของคุณ - แต่ในกรณีนี้คุณสามารถตั้งค่าเริ่มต้นเป็นสระ / a สำหรับพยัญชนะหรือใช้ฮิวริสติกอื่น ๆ ที่มีโอกาสดีกว่า
(เมื่อดูจากพจนานุกรมของมช. ฉันรู้สึกยินดีที่เห็นว่ามีคำนามที่เหมาะสมสำหรับประเทศและสถานที่อื่น ๆ - ดังนั้นจะมีตัวอย่างเช่น "a Ukrainian", "a USA Today paper", "a Urals-inspired painting")
การแก้ไขอีกครั้งเพื่อเพิ่ม: พจนานุกรม CMU ไม่มีคำย่อทั่วไปและคุณต้องกังวลเกี่ยวกับคำที่ขึ้นต้นด้วย s, f, l, m, n, u และ x แต่มีรายการตัวย่อมากมายเช่นใน Wikipedia ซึ่งคุณสามารถใช้เพื่อเพิ่มข้อยกเว้นได้
hawr-uh-buhl
ทำให้ฉันหัวเราะได้เสมอ
คุณต้องดำเนินการด้วยตนเองและเพิ่มข้อยกเว้นที่คุณต้องการเช่นหากตัวอักษรตัวแรกเป็น 'H' และตามด้วย 'O' เช่นซื่อสัตย์ชั่วโมง ... และตัวตรงข้ามเช่นยุโรปมหาวิทยาลัยใช้ ...
เนื่องจาก "a" และ "an" ถูกกำหนดโดยกฎการออกเสียงและไม่ใช่รูปแบบการสะกดฉันจึงอาจทำเช่นนี้:
คุณต้องดูกฎทางไวยากรณ์สำหรับบทความที่ไม่มีกำหนด (มีเพียงสองบทความในไวยากรณ์ภาษาอังกฤษ "a" และ "an) คุณอาจไม่เห็นด้วยว่าเสียงเหล่านี้ถูกต้อง แต่กฎของไวยากรณ์ภาษาอังกฤษมีความชัดเจนมาก :
"คำว่า a และ a เป็นบทความที่ไม่มีกำหนดเราใช้บทความที่ไม่มีกำหนดก่อนคำที่ขึ้นต้นด้วยเสียงสระ (a, e, i, o, u) และบทความที่ไม่มีกำหนด a ก่อนคำที่ขึ้นต้นด้วยเสียงพยัญชนะ (ทั้งหมด ตัวอักษรอื่น ๆ ) "
หมายเหตุที่นี้หมายถึงสระเสียงและไม่เป็นสระเสียงตัวอักษร ตัวอย่างเช่นคำที่ขึ้นต้นด้วย "h" ที่เงียบเช่น "เกียรติ" หรือ "ทายาท" จะถือว่าเป็นเสียงสระและจะใช้ "an" - เช่น "เป็นเกียรติที่ได้พบคุณ" คำที่ขึ้นต้นด้วยเสียงพยัญชนะนำหน้าด้วย a - ซึ่งเป็นสาเหตุที่คุณพูดว่า "รถมือสอง" แทนที่จะเป็น "รถมือสอง" - เนื่องจาก "used" มีเสียง "yoose" แทนที่จะเป็นเสียง "uhh"
ดังนั้นในฐานะโปรแกรมเมอร์สิ่งเหล่านี้คือกฎที่ต้องปฏิบัติตาม คุณเพียงแค่ต้องหาวิธีพิจารณาว่าคำขึ้นต้นด้วยเสียงอะไรแทนที่จะเป็นตัวอักษร ฉันเคยเห็นตัวอย่างเช่นนี้ใน PHPโดย 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';
}
อาจง่ายที่สุดในการสร้างกฎจากนั้นสร้างรายการข้อยกเว้นและใช้สิ่งนั้น ฉันไม่คิดว่าจะมีมากมายขนาดนั้น
ผู้ชายฉันรู้ว่านี่อาจเป็นข้อโต้แย้งที่ตัดสินได้ แต่ฉันคิดว่ามันสามารถตัดสินได้ง่ายกว่าการใช้กฎไวยากรณ์เฉพาะกิจจากวิกิพีเดียซึ่งจะได้รับไวยากรณ์ภาษาพื้นถิ่นที่ดีที่สุด
ดูเหมือนว่าทางออกที่ดีที่สุดคือการใช้ a หรือทริกเกอร์การจับคู่ตามหน่วยเสียงของคำต่อไปนี้โดยมีหน่วยเสียงบางส่วนเชื่อมโยงกับ "an" เสมอและส่วนที่เหลือเป็นของ "a"
มหาวิทยาลัย Carnegie Mellon มีเครื่องมือออนไลน์ที่ยอดเยี่ยมสำหรับการตรวจสอบประเภทนี้ - http://www.speech.cs.cmu.edu/cgi-bin/cmudict - และมีคำ 125k พร้อมด้วย 39 หน่วยเสียงที่ตรงกัน การเสียบคำเข้าทำให้ชุดการออกเสียงทั้งหมดซึ่งมีเพียงคำแรกเท่านั้นที่สำคัญ
หากคำนั้นไม่ปรากฏในพจนานุกรมเช่น "NSA" และเป็นตัวพิมพ์ใหญ่ทั้งหมดระบบจะถือว่าคำนั้นเป็นตัวย่อและใช้ตัวอักษรตัวแรกเพื่อพิจารณาว่าจะใช้บทความใดไม่ จำกัด ตามกฎเดิมที่ตั้งไว้
@ นาธานลอง: การดาวน์โหลดวิกิพีเดียไม่ใช่ความคิดที่แย่ ไม่จำเป็นต้องใช้รูปภาพวิดีโอและสื่ออื่น ๆ ทั้งหมด
ฉันเขียนโปรแกรม (เส็งเคร็ง) ใน php และ javascript (!) เพื่ออ่านวิกิพีเดียภาษาสวีเดนทั้งหมด (หรืออย่างน้อย aricles ทั้งหมดที่สามารถเข้าถึงได้จาก aricle เกี่ยวกับคณิตศาสตร์ซึ่งเป็นจุดเริ่มต้นสำหรับแมงมุมของฉัน)
ฉันรวบรวมคำและลิงค์ภายในทั้งหมดไว้ในฐานข้อมูลและยังติดตามความถี่ของทุกคำ ตอนนี้ฉันใช้เป็นฐานข้อมูลคำสำหรับงานต่างๆ: * การค้นหาคำทั้งหมดที่สามารถสร้างจากชุดตัวอักษรที่กำหนด (รวมถึงสัญลักษณ์แทน) * สร้างไฟล์ไวยากรณ์ง่ายๆสำหรับภาษาสวีเดน (ทุกคำที่ไม่อยู่ในฐานข้อมูลถือว่าไม่ถูกต้อง)
โอ้และการดาวน์โหลด wiki ทั้งหมดใช้เวลาประมาณหนึ่งสัปดาห์โดยใช้แล็ปท็อปของฉันทำงานเกือบตลอดเวลาโดยมีการเชื่อมต่อ 10Mbit
เมื่อคุณอยู่ที่นั่นให้บันทึกเหตุการณ์ทั้งหมดที่ไม่สอดคล้องกับภาษาอังกฤษและดูว่าบางเหตุการณ์ผิดพลาดหรือไม่ ไปแก้ไขและให้บางสิ่งกลับคืนสู่ชุมชน
โปรดทราบว่ามีความแตกต่างระหว่างภาษาถิ่นของอเมริกาและอังกฤษดังที่ Grammar Girl ชี้ให้เห็นในตอนA Versus An ของเธอ
ภาวะแทรกซ้อนอย่างหนึ่งคือเมื่อคำต่างๆออกเสียงในภาษาอังกฤษแบบอังกฤษและแบบอเมริกันต่างกัน ตัวอย่างเช่นคำของพืชบางชนิดออกเสียงว่า "erb" ในภาษาอังกฤษแบบอเมริกันและ "สมุนไพร" ในภาษาอังกฤษแบบบริติช ในกรณีที่เกิดปัญหาไม่บ่อยนักให้ใช้แบบฟอร์มที่คาดว่าจะเกิดขึ้นในประเทศของคุณหรือโดยผู้อ่านส่วนใหญ่ของคุณ
ลองดูที่ Perl ของLingua :: EN :: โค้ง ดูsub _indef_article
ในซอร์สโค้ด
ฉันได้ย้ายฟังก์ชั่นจากPython (เดิมมาจากแพ็คเกจ CPAN Lingua-EN-Inflect) ที่กำหนดเสียงสระใน C # อย่างถูกต้องและโพสต์เป็นคำตอบสำหรับคำถามโดยทางโปรแกรมจะกำหนดว่าจะอธิบายวัตถุด้วย a หรือ? . คุณสามารถดูข้อมูลโค้ดที่นี่
คุณขอพจนานุกรมภาษาอังกฤษที่เก็บคำที่เขียนด้วยตัวอักษรปกติของเราและอักษรโฟนีติกสากลได้ไหม
จากนั้นใช้วิชาฟิสิกส์เพื่อหาเสียงเริ่มต้นของคำและด้วยเหตุนี้ว่า "a" หรือ "an" เหมาะสมหรือไม่?
ไม่แน่ใจว่าวิธีนี้จะง่ายกว่า (หรือสนุกพอ ๆ กับ) วิธีการทางสถิติของ Wikipedia
ฉันจะใช้อัลกอริทึมที่อิงตามกฎเพื่อให้ครอบคลุมมากที่สุดเท่าที่จะทำได้จากนั้นใช้รายการข้อยกเว้น หากคุณต้องการจินตนาการคุณสามารถลองกำหนด "กฎ" ใหม่ ๆ จากรายการข้อยกเว้นของคุณ
ฉันดูเหมือนชุดของฮิวริสติกส์ มันต้องซับซ้อนกว่านี้หน่อยและตอบโจทย์บางอย่างซึ่งฉันไม่เคยได้คำตอบที่ดีมาก่อนเช่นคุณใช้ตัวย่ออย่างไร ("a RPM" หรือ "an RPM" ฉันคิดเสมอว่าอันหลังเหมาะสมกว่า)
การค้นหาอย่างรวดเร็วให้ผลในไลบรารีภาษาที่พูดถึงวิธีจัดการคำนำหน้าเอกพจน์ภาษาอังกฤษ แต่คุณอาจพบบางสิ่งบางอย่างหากคุณขุดได้มากพอ และถ้าไม่คุณสามารถเขียนไลบรารีการผันคำของคุณเองและรับชื่อเสียงระดับโลกได้ตลอดเวลา :-)
ฉันไม่คิดว่าคุณจะเติมจานหม้อไอน้ำบางอย่างเช่น 'a / an' เป็นขั้นตอนเดียวได้ทั้งหมด มิฉะนั้นคุณจะจบลงด้วยข้อผิดพลาดในการสันนิษฐานเช่นทุกคำที่มี 'h' ดำเนินการโดย 'o' get 'an' แทน 'a' like 'home' - (บ้าน? โดยพื้นฐานแล้วคุณจะต้องรวมตรรกะของภาษาอังกฤษหรือบางครั้งอาจพบกรณีที่หายากที่จะทำให้คุณดูโง่เขลา
ตรวจสอบว่าคำขึ้นต้นด้วยสระหรือพยัญชนะ โดยทั่วไปแล้ว "u" เป็นพยัญชนะและสระ ("yu") จึงอยู่ในกลุ่มพยัญชนะตามวัตถุประสงค์ของคุณ
ตัวอักษร "h" ย่อมาจาก gottal stop (พยัญชนะ) ในภาษาฝรั่งเศสและในคำภาษาฝรั่งเศสที่ใช้ในภาษาอังกฤษ คุณสามารถสร้างรายชื่อของสิ่งเหล่านี้ (อันที่จริงรวมถึง "เกียรติ" "เกียรติ" และ "ชั่วโมง" อาจเพียงพอ) และนับว่าเริ่มต้นด้วยเสียงสระ (เนื่องจากภาษาอังกฤษไม่รู้จักการหยุดเสียง)
ยังนับ "eu" เป็นพยัญชนะเป็นต้น
ก็ไม่ยากเกินไป
การเลือก a หรือ a ขึ้นอยู่กับวิธีการออกเสียงของคำ การดูคำนั้นคุณไม่สามารถบอกการออกเสียงที่ถูกต้องได้เช่นศัพท์แสงหรือคำย่อเป็นต้นวิธีหนึ่งคือการมีพจนานุกรมที่รองรับหน่วยเสียงและใช้ข้อมูลหน่วยเสียงที่เกี่ยวข้องกับคำนั้นเพื่อตรวจสอบว่า "a "หรือ" an "ควรใช้
ฉันไม่แน่ใจว่าข้อมูลนี้มีข้อมูลที่เหมาะสมเพื่อแยกความแตกต่างของ "a" และ "an" แต่ฐานข้อมูลWordNetของ Princeton มีอยู่อย่างแม่นยำเพื่อจุดประสงค์ของงานประเภทเดียวกันดังนั้นฉันจึงคิดว่ามีข้อมูลอยู่ในนั้น . มีคำหลายหมื่นคำและความสัมพันธ์หลายแสนระหว่างคำที่กล่าว (IIRC ฉันไม่พบสถิติปัจจุบันในไซต์) ให้มันดู ดาวน์โหลดได้อย่างอิสระ
อย่างไร? แล้วเมื่อไหร่? รับคำนามพร้อมแนบบทความ ขอในรูปแบบเฉพาะ
ขอคำนามกับบทความ MUD codebase จำนวนมากเก็บไอเท็มไว้เป็นข้อมูลประกอบด้วย:
แบบฟอร์มคำหลักอาจเป็น "ดาบสั้นสนิม" แบบสั้นจะเป็น "ดาบ" แบบยาวจะเป็น "ดาบสั้นขึ้นสนิม"
คุณกำลังเขียนเว็บเซอร์วิสแบบ "a vs. an" หรือไม่? ย้อนกลับไปดูว่าคุณสามารถโจมตีการรั่วไหลนี้ต่อไปที่ต้นน้ำได้หรือไม่ คุณสามารถสร้างเขื่อนได้ แต่ถ้าคุณไม่หยุดไหลมันก็จะล้นออกมาในที่สุด
พิจารณาว่าสิ่งนี้มีความสำคัญเพียงใดและตามที่คนอื่น ๆ แนะนำให้ไปที่ "รวดเร็ว แต่หยาบ" หรือ "แพง แต่ทนทาน"
กฎง่ายมาก ถ้าคำถัดไปขึ้นต้นด้วยเสียงสระให้ใช้ 'an' ถ้าขึ้นต้นด้วยพยัญชนะให้ใช้ 'a' สิ่งที่ยากคือการจำแนกสระและพยัญชนะในโรงเรียนของเราไม่ได้ผล 'h' in 'honor' เป็นเสียงสระ แต่ 'h' ใน 'hospital' เป็นพยัญชนะ
ที่แย่ไปกว่านั้นคือคำบางคำเช่น 'ซื่อสัตย์' เริ่มต้นด้วยสระหรือพยัญชนะขึ้นอยู่กับว่าใครเป็นคนพูด ที่แย่ไปกว่านั้นคือคำบางคำเปลี่ยนไปขึ้นอยู่กับคำรอบตัวของผู้พูดบางคน
ปัญหามีขอบเขตอยู่ที่ระยะเวลาและความพยายามที่คุณต้องการเท่านั้น คุณสามารถเขียนอะไรเป็นคู่ ๆ โดยใช้ 'aeiou' เป็นเสียงสระได้ในสองสามนาทีหรือคุณอาจใช้เวลาหลายเดือนในการวิเคราะห์กลุ่มเป้าหมายของคุณ ระหว่างพวกเขาเป็นฮิวริสติกส์จำนวนมากซึ่งจะถูกต้องสำหรับผู้พูดบางคนและไม่ถูกต้องสำหรับผู้อื่น - แต่เนื่องจากผู้พูดที่แตกต่างกันมีการกำหนดที่แตกต่างกันสำหรับคำเดียวกันจึงเป็นไปไม่ได้ที่จะถูกต้องตลอดเวลาไม่ว่าคุณจะทำอย่างไร มัน.
แนวทางที่ดีที่สุดคือการค้นหาสถานที่ทางออนไลน์ที่สามารถให้คำตอบค้นหาแบบไดนามิกและแคชคำตอบ คุณสามารถกำหนดระบบด้วยคำไม่กี่ร้อยคำเพื่อเริ่มต้น
(ฉันไม่รู้แหล่งข้อมูลออนไลน์แบบนี้ แต่ฉันจะไม่แปลกใจเลยถ้ามี)
ดังนั้นวิธีแก้ปัญหาที่สมเหตุสมผลจึงเป็นไปได้โดยไม่ต้องดาวน์โหลดอินเทอร์เน็ตทั้งหมด นี่คือสิ่งที่ฉันทำ:
ผมจำได้ว่า Google ตีพิมพ์ข้อมูลดิบของพวกเขาสำหรับความถี่ Google หนังสือ N-แกรมที่นี่ ฉันจึงดาวน์โหลดไฟล์ขนาด 2 กรัมสำหรับ "a_" และ "an" ประมาณ 26 กิ๊กถ้าจำไม่ผิด จากนั้นฉันได้สร้างรายการสตริงที่พวกเขานำหน้าอย่างท่วมท้นด้วยบทความตรงข้ามที่คุณคาดหวัง (ถ้าเราคาดหวังว่าสระจะใช้ "an") รายการคำสุดท้ายนั้นฉันสามารถจัดเก็บได้ภายใน 7 กิโลไบต์
คุณใช้ "a" เมื่อใดก็ตามที่คำถัดไปไม่ใช่สระ? และคุณใช้ "an" เมื่อใดก็ตามที่มีสระ?
จากที่กล่าวมาคุณไม่สามารถใช้นิพจน์ทั่วไปเช่น "a \ s [a, e, i, o, u] *" ได้หรือไม่? แล้วแทนที่ด้วย "an?"