명사가 주어진 경우 "a"또는 "an"을 정확히 접두사로 지정하는 .NET 응용 프로그램이 있습니다. 어떻게할까요?
첫 글자가 모음인지 확인하는 것이 답이라고 생각하기 전에 다음과 같은 구문을 고려하십시오.
- 정직한 실수
- 중고차
명사가 주어진 경우 "a"또는 "an"을 정확히 접두사로 지정하는 .NET 응용 프로그램이 있습니다. 어떻게할까요?
첫 글자가 모음인지 확인하는 것이 답이라고 생각하기 전에 다음과 같은 구문을 고려하십시오.
답변:
아마도 이것보다 훨씬 나아질 수는 없을 것이며 대부분의 규칙 기반 시스템을 능가 할 것입니다.
편집 : 나는 이것을 JS / C #에서 구현했습니다 . 브라우저에서 사용해 보거나 사용 하는 작고 재사용 가능한 자바 스크립트 구현을 다운로드 할 수 있습니다 . .NET 구현은 AvsAn
nuget의 패키지 입니다 . 구현은 간단하므로 필요한 경우 다른 언어로 쉽게 이식 할 수 있어야합니다.
"규칙"은 내가 생각했던 것보다 훨씬 더 복잡하다는 것이 밝혀졌습니다.
... 규칙 기반 시스템을 구축하기가 까다로울 것이라는 점을 강조합니다!
예외 목록을 사용해야합니다. 나는 모든 예외가 잘 정의되어 있다고 생각하지 않습니다. 왜냐하면 그것은 때때로 단어를 말하는 사람의 억양에 달려 있기 때문입니다.
한 가지 어리석은 방법은 Google에 두 가지 가능성 (검색 API 중 하나 사용)을 요청하고 가장 인기있는 방법을 사용하는 것입니다.
또는:
따라서 "유럽"과 "정직한"이 올바른 버전입니다.
다음과 같이 단어 발음에 대한 단어 철자의 출처를 찾을 수 있다면 :
"honest":"on-ist"
"horrible":"hawr-uh-buhl, hor-"
철자가 표시된 발음 문자열의 첫 번째 문자를 기준으로 결정을 내릴 수 있습니다. 성능을 위해 이러한 조회를 사용하여 예외 집합을 미리 생성하고 대신 실행 중에 이러한 작은 조회 집합을 사용할 수 있습니다.
추가하기 위해 편집 :
!!! -예외를 생성하기 위해 이것을 사용할 수 있다고 생각합니다 : http://www.speech.cs.cmu.edu/cgi-bin/cmudict
물론 모든 것이 사전에있는 것은 아닙니다. 즉, 가능한 모든 예외가 예외 세트에 포함되는 것은 아닙니다.하지만이 경우에는 모음 / 자음에 대해 기본값으로 설정하거나 더 나은 확률로 다른 휴리스틱을 사용할 수 있습니다.
(CMU 사전을 보니 국가와 다른 장소에 대한 고유 명사가 포함되어있어서 기뻤습니다. 그래서 "우크라이나어", "USA 투데이 논문", "우랄에서 영감을 얻은 그림"과 같은 예를 들었습니다.)
한 번 더 편집하여 추가 : CMU 사전에는 일반적인 약어가 포함되어 있지 않으므로 s, f, l, m, n, u 및 x로 시작하는 단어에 대해 걱정해야합니다. 그러나 Wikipedia와 같이 예외에 추가하는 데 사용할 수있는 많은 약어 목록이 있습니다.
hawr-uh-buhl
나를 도울 수는 없지만 항상 나를 웃게 만든다.
예를 들어 첫 번째 문자가 'H'이고 정직, 시간과 같은 'O'가 뒤 따르고 유럽, 대학교, 중고등과 같은 반대 문자가 오는 경우와 같이 원하는 예외를 수동으로 구현하고 추가해야합니다.
"a"와 "an"은 철자 규칙이 아닌 음성 규칙에 의해 결정되므로 다음과 같이 할 수 있습니다.
부정 관사에 대한 문법 규칙을 살펴 봐야합니다 (영어 문법에는 "a"와 "an"이라는 두 개의 부정 관사 만 있습니다).이 말이 정확하지 않을 수 있지만 영문법 의 규칙 은 매우 명확합니다 .
"단어 a와 an은 부정 관사입니다. 우리는 모음 소리 (a, e, i, o, u)로 시작하는 부정 관사 an 앞에 나오는 단어와 자음으로 시작하는 단어 앞에있는 부정 관사 a를 사용합니다 (모두 다른 글자). "
이것은 모음 문자가 아니라 모음 소리를 의미합니다 . 예를 들어 "honour"또는 "heir"과 같이 무음 "h"로 시작하는 단어는 모음으로 취급되므로 "an"으로 진행됩니다 (예 : "만나서 영광"). 자음으로 시작하는 단어는 "중고차"가 아닌 "중고차"로 시작하는 접두사가 붙습니다. "중고"는 "어"소리가 아닌 "요스"소리가 나기 때문입니다.
그래서 프로그래머로서 이것들은 따라야 할 규칙입니다. 글자가 아닌 단어가 어떤 소리로 시작하는지 확인하는 방법을 찾아야합니다. Jaimie Sirovich의 PHP에서 다음 과 같은 예제를 보았습니다.
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을 사용하여 다음 단어의 음소 기반 일치를 트리거하는 것입니다. 특정 음소는 항상 "an"과 연관되고 나머지는 "a"에 속합니다.
Carnegie Mellon University는 이러한 종류의 수표를위한 훌륭한 온라인 도구를 제공합니다-http: //www.speech.cs.cmu.edu/cgi-bin/cmudict 와 일치하는 39 개의 음소를 가진 125k 단어를 가지고 있습니다. 단어를 연결하면 전체 음소 세트가 제공되며 그중 첫 번째 만 중요합니다.
단어가 "NSA"와 같이 사전에 나타나지 않고 모두 대문자 인 경우 시스템은 해당 단어가 약어라고 가정하고 첫 글자를 사용하여 동일한 원래 규칙 세트를 기반으로 사용할 무기한 기사를 결정할 수 있습니다.
@Nathan Long : wikipedia를 다운로드하는 것은 실제로 나쁜 생각이 아닙니다. 모든 이미지, 비디오 및 기타 미디어가 필요하지 않습니다.
저는 스웨덴 위키피디아 전체를 읽기 위해 PHP와 javascript (!)로 (엉뚱한) 프로그램을 썼습니다.
모든 단어와 내부 링크를 데이터베이스에 수집하고 모든 단어의 빈도를 추적했습니다. 이제 다양한 작업을위한 단어 데이터베이스로 사용합니다. * 주어진 문자 집합 (와일드 카드 포함)에서 생성 할 수있는 모든 단어 찾기 * 스웨덴어 용 간단한 구문 파일 생성 (데이터베이스에없는 모든 단어는 잘못된 것으로 간주 됨).
아, 그리고 전체 위키를 다운로드하는 데 약 일주일이 걸렸습니다. 10Mbit 연결로 대부분의 시간을 실행하는 랩톱을 사용했습니다.
당신이 그것에있을 때, 영어와 일치하지 않는 모든 사건을 기록하고 그중 일부가 실수인지 확인하십시오. 가서 고쳐서 커뮤니티에 돌려주세요.
Grammar Girl이 에피소드 A Versus An 에서 지적했듯이 미국 방언과 영국 방언에는 차이가 있습니다 .
한 가지 문제는 영어와 미국 영어에서 단어가 다르게 발음되는 경우입니다. 예를 들어, 특정 종류의 식물에 대한 단어는 미국 영어에서는 "erb"로, 영국 영어에서는 "herb"로 발음됩니다. 드물지만 이것이 문제가되는 경우, 귀하의 국가 또는 대부분의 독자가 예상하는 양식을 사용하십시오.
Perl의 Lingua :: EN :: Inflect를 살펴보십시오 . sub _indef_article
소스 코드를 참조하십시오 .
일반 알파벳으로 쓰여진 단어를 저장하는 영어 사전과 International Phoenetic 알파벳을 구할 수 있습니까?
그런 다음 phoenetics를 사용하여 단어의 시작 소리를 파악하고 "a"또는 "an"이 적절한 지 여부를 파악하십시오.
그것이 실제로 통계적 Wikipedia 접근 방식보다 쉬울 지 (또는 훨씬 재미 있을지) 확실하지 않습니다.
규칙 기반 알고리즘을 사용하여 최대한 많은 것을 처리 한 다음 예외 목록을 사용합니다. 멋지고 싶다면 예외 목록에서 몇 가지 새로운 "규칙"을 결정할 수 있습니다.
나는 단지 일련의 휴리스틱 스처럼 보입니다. 예를 들어 약어를 어떻게 처리합니까 ( "a RPM"또는 "an RPM"? 항상 후자가 더 합리적이라고 생각했습니다).
영어 단수 접두어를 처리하는 방법에 대해 이야기하는 언어 라이브러리에서 빠른 검색이 이루어졌지만 충분히 파헤 치면 무언가를 찾을 수있을 것입니다. 그리고 그렇지 않다면 항상 자신 만의 굴절 라이브러리를 작성하고 세계적으로 명성을 얻을 수 있습니다. :-).
나는 당신이 'a / an'과 같은 일부 보일러 플레이트를 한 단계 커버 올로 채울 수 있다고 생각하지 않습니다. 그렇지 않으면 'h'가있는 모든 단어와 같은 가정 오류가 발생합니다. 'o'로 진행하면 'home'과 같은 'a'대신 'an'을 얻습니다-(an home?). 기본적으로 영어의 논리를 포함하거나 가끔 어리석게 보일 드문 경우를 찾을 수 있습니다.
어떻게? 언제 어때? 기사가 첨부 된 명사를 가져옵니다. 특정 형태로 요청하십시오.
기사와 함께 명사를 요청하십시오. 많은 MUD 코드베이스는 다음으로 구성된 정보로 항목을 저장합니다.
키워드 형식은 "Short Sword rusty"일 수 있습니다. 약식은 "검"입니다. 긴 형태는 "녹슨 단검"입니다.
"a vs. an"웹 서비스를 작성하고 있습니까? 한 발 물러서서이 유출을 더 상류에서 공격 할 수 있는지 살펴보십시오. 댐을 지을 수는 있지만 흐름을 멈추지 않으면 결국 넘칠 것입니다.
이것이 얼마나 중요한지 결정하고 다른 사람들이 제안한 것처럼 "빠르지 만 조잡한"또는 "비싸지 만 견고 함"을 선택하십시오.
규칙은 매우 간단합니다. 다음 단어가 모음 소리로 시작하면 'an'을 사용하고 자음으로 시작하면 'a'를 사용합니다. 어려운 점은 학교의 모음과 자음 분류가 작동하지 않는다는 것입니다. 'honour'의 'h'는 모음이지만 'hospital'의 'h'는 자음입니다.
설상가상으로 '정직'과 같은 일부 단어는 누가 말하는지에 따라 모음이나 자음으로 시작됩니다. 더 나쁜 것은 일부 화자의 주변 단어에 따라 일부 단어가 변경된다는 것입니다.
문제는 얼마나 많은 시간과 노력을 쏟고 싶은지에 의해서만 제한됩니다. 몇 분 안에 'aeiou'를 모음으로 사용하여 커플로 무언가를 쓰거나 타겟 청중에 대한 언어 분석을 수행하는 데 몇 달을 보낼 수 있습니다. 그들 사이에는 일부 화자에게는 옳고 다른 사람에게는 틀릴 수있는 수많은 휴리스틱이 있습니다. 그러나 서로 다른 화자들은 같은 단어에 대해 서로 다른 결정을 내리기 때문에 당신이 어떻게하든 항상 옳다는 것은 불가능합니다 그것.
따라서 인터넷을 모두 다운로드하지 않고도 합리적인 솔루션이 가능합니다. 내가 한 일은 다음과 같습니다.
Google이 여기 에 Google Books N-Gram 주파수에 대한 원시 데이터를 게시 한 것을 기억했습니다 . 그래서 "a_"와 "an"에 대한 2 그램 파일을 다운로드했습니다. 제대로 기억하면 약 26 기가입니다. 그것으로부터 나는 당신이 기대하는 반대 기사가 압도적으로 앞에 오는 문자열 목록을 만들었습니다 (모음이 "an"을 기대한다면). 7 킬로바이트 미만으로 저장할 수있는 마지막 단어 목록입니다.
다음 단어가 모음이 아닐 때마다 "a"를 사용합니까? 그리고 모음이있을 때마다 "an"을 사용합니까?
그렇다면 "a \ s [a, e, i, o, u]. *"와 같은 정규식을 수행 할 수 없습니까? 그런 다음 "an?"으로 바꾸십시오.