"a"와 "an"을 단어 앞에 올바르게 붙이려면 어떻게해야합니까?


93

명사가 주어진 경우 "a"또는 "an"을 정확히 접두사로 지정하는 .NET 응용 프로그램이 있습니다. 어떻게할까요?

첫 글자가 모음인지 확인하는 것이 답이라고 생각하기 전에 다음과 같은 구문을 고려하십시오.

  • 정직한 실수
  • 중고차

4
또한 "a"또는 "an"에서 "an NHL"과 같이 혼동을 일으킬 수있는 약어를 고려해야합니다.이 경우에도 문자의 소리는 모음으로 시작되지만 약어가 다음과 같은 단어로 발음 될 수있는 경우에는 그렇지 않습니다. "NAS 장치"또는 "NASCAR 이벤트"로
JB King

5
또한 a 또는 an의 사용은 사용되는 다양한 영어의 특정 발음에 따라 달라질 수 있습니다. 영국과 미국의 herb 발음이 그러한 예 중 하나입니다.
Eric

12
@Eric : 실제로 제가 가장 좋아하는 예는 "SQL"입니다. 어떤 사람들은 "SQL"이라는 글자를 말하고 어떤 사람들은 "sequel"이라는 단어처럼 발음합니다. 각각 다른 "a"또는 "an"을 얻습니다. 예 : "속편 문"과 "SQL 문"구절
Binary Worrier

더 어려운 것은 영어의 같은 방언 안에서 의견이 다르다는 것입니다! 예를 들어, 공식 (영국) 영어에서는 "호텔"이 올바른 구조라고 말하지만 대부분의 사람들은 일상 대화에서 "호텔"을 사용합니다. 하나를 쓰면 나머지 우리에게 매우 유용 할 것입니다!
h4xxr 09-08-17

아 ... "지망자 H". 나는 그것과의 첫 만남을 생생하게 기억한다. 식민지 시대의 윌리엄스 버그에 관한 책인 "역사 사회"라는 제목의 2 학년 사회학 책.
Bob Kaufman

답변:


137
  1. Wikipedia 다운로드
  2. 압축을 풀고 기사 텍스트 만 뱉어내는 빠른 필터 프로그램을 작성하십시오 (다운로드는 일반적으로 기사가 아닌 메타 데이터와 함께 XML 형식입니다).
  3. a (n) ....의 모든 인스턴스를 찾고 다음 단어와 모든 접두사에 색인을 만듭니다 (이에 대해 간단한 접미사를 사용할 수 있음). 대소 문자를 구분해야하며 최대 단어 길이 (15 자)가 필요합니까?
  4. (선택 사항) 5 회 미만으로 발생하거나 "a"대 "an"이 2/3 미만을 달성하는 접두사를 모두 폐기합니다 (또는 다른 임계 값-여기서 조정). 코너 케이스를 피하기 위해 빈 접두사를 유지하는 것이 좋습니다.
  5. 부모가 동일한 "a"또는 "an"주석을 공유하는 모든 접두사를 삭제하여 접두사 데이터베이스를 최적화 할 수 있습니다.
  6. "A"또는 "AN"을 사용할지 여부를 결정할 때 가장 긴 일치하는 접두사를 찾고 그 앞을 따릅니다. 4 단계에서 빈 접두사를 버리지 않은 경우 항상 일치하는 접두사 (즉, 빈 접두사)가 있습니다. 그렇지 않으면 완전히 일치하지 않는 문자열에 대해 특별한 경우가 필요할 수 있습니다 (이러한 입력은 매우 드뭅니다). .

아마도 이것보다 훨씬 나아질 수는 없을 것이며 대부분의 규칙 기반 시스템을 능가 할 것입니다.

편집 : 나는 이것을 JS / C #에서 구현했습니다 . 브라우저에서 사용해 보거나 사용 하는 작고 재사용 가능한 자바 스크립트 구현을 다운로드 할 수 있습니다 . .NET 구현은 AvsAnnuget의 패키지 입니다 . 구현은 간단하므로 필요한 경우 다른 언어로 쉽게 이식 할 수 있어야합니다.

"규칙"은 내가 생각했던 것보다 훨씬 더 복잡하다는 것이 밝혀졌습니다.

  • 그건 예상치 못한 결과 만입니다 만장일치
  • 그건 정직 결정하지만 인동 덩굴 관목
  • 기호 : 그것은 0800 번호 또는 오레가노의 ∞.
  • 약어 : 그것은 NASA 과학자,하지만 NSA 분석가; 피아트 자동차하지만 FAA 정책.

... 규칙 기반 시스템을 구축하기가 까다로울 것이라는 점을 강조합니다!


이 출력에서 ​​명사가 누락 된 경우에는 확실히 간단한 규칙 엔진으로 돌아갈 수 있습니다.
John Fisher

26
위키피디아 다운로드가 (현재) 2.8 테라 바이트로 압축 해제된다는 점을 감안할 때,이 방법을 사용하는 사람이 결과 데이터를 공개적으로 게시하여 프로세스를 많이 반복 할 필요가 없도록한다면 좋을 것입니다.
Nathan Long

10
이 대답은 전적으로 진지하지는 않았지만 이와 같은 작업을 수행했으며 원시 wikimarkup이있는 wikipedia의 .xml 파일은 2.8TB가 아닌 40GB (최신 파일은 항상 조금 더 큽니다)입니다. -확장 된 .html 버전이나 이미지를 다운로드하지 마세요. 2.8TB 버전 일 수도 있습니다. 어쨌든 마크 업에 대해 까다롭게하지 않는 한 실제로 구문 분석이 가능합니다.
Eamon Nerbonne

1
가장 쉽게 사용할 수있는 최신 자연어 데이터 세트 중 하나입니다. 그러나 추가 데이터 소스도 괜찮습니다. 알고리즘은 결국 위키피디아에 의존하지 않습니다. 당신의 온라인 구현을 시도 할 수 home.nerbonne.org/A-vs-An 또는 내 블로그
에이 몬 Nerbonne

1
나는 한 이상 이 솔루션에 감동. 솔직히 Wikipedia 전체를 다운로드 하는 것보다 훨씬 간단 할 것이라고 생각했습니다 . 잘하셨습니다. +1
Kehlan Krumme 2014 년

15

예외 목록을 사용해야합니다. 나는 모든 예외가 잘 정의되어 있다고 생각하지 않습니다. 왜냐하면 그것은 때때로 단어를 말하는 사람의 억양에 달려 있기 때문입니다.

한 가지 어리석은 방법은 Google에 두 가지 가능성 (검색 API 중 하나 사용)을 요청하고 가장 인기있는 방법을 사용하는 것입니다.

또는:

따라서 "유럽"과 "정직한"이 올바른 버전입니다.


6
실제로 허용 된 사용입니까, 아니면 금지를 요청하는 것입니까? 이러한 정기적 인 사용은 확실히 IIRC에 눈살을 찌푸립니다.
Eamon Nerbonne

1
@Eamon : 흥미로운 점. 응용 프로그램이 이전에 검색 한 모든 단어를 기록하여 새 단어가 나올 때마다 한 번만 검색하면 어떨까요? 여전히 Google의 사용이 의심 스럽습니까?
gnovice

2
명백한 기술적 어려움 (이와 같이 자동화 된 방식으로 검색 엔진 출력을 사용하는 것은 허용되지 않으며 오히려 빠르게 차단 될 것임)을 제외하고 이것은 문제를 올바른 방식으로 해결하지 못합니다. 최악의 경우 일반적인 오용을 복제합니다. 통사론.
Guss

6
아무리 나빠도? "일반적인 오용"을 복제하는 것이 자연어 시스템이 추구해야하는 것과 정확히 일치해야한다는 강력한 주장이 있습니다. 랍스터 고려에서 David Foster Wallace의 에세이 "Authority and American Usage"를 참조 하십시오 . Google보다 더 나은 말뭉치가 있지만 그것은 다른 문제입니다.
Robert Rossney

2
"호텔"과 "여 주인공"둘 다 나에게 맞는 것 같다. 나는 당신이 약간 멍청한 악센트 관점에서 오는 것 같아요. 억양이 다르다는 것은이 단어들 중 일부에 대한 정답이 없다는 것을 의미합니다.
rjmunro

15

다음과 같이 단어 발음에 대한 단어 철자의 출처를 찾을 수 있다면 :

"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와 같이 예외에 추가하는 데 사용할 수있는 많은 약어 목록이 있습니다.


2
hawr-uh-buhl나를 도울 수는 없지만 항상 나를 웃게 만든다.
IllidanS4는 Monica가 2014

9

예를 들어 첫 번째 문자가 'H'이고 정직, 시간과 같은 'O'가 뒤 따르고 유럽, 대학교, 중고등과 같은 반대 문자가 오는 경우와 같이 원하는 예외를 수동으로 구현하고 추가해야합니다.


1
그래 진정한 남자. 내가 착각 한 것 같아요. 전혀 규칙이 없습니다
Ahmad Farid

8

"a"와 "an"은 철자 규칙이 아닌 음성 규칙에 의해 결정되므로 다음과 같이 할 수 있습니다.

  1. 단어의 첫 글자가 자음 인 경우-> 'a'
  2. 단어의 첫 글자가 모음-> 'an'인 경우
  3. rjumnro가 말한 대로 예외 목록 (심장, 엑스레이, 집)을 보관하십시오 .

5

부정 관사에 대한 문법 규칙을 살펴 봐야합니다 (영어 문법에는 "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'; 
}

규칙을 만든 다음 예외 목록을 만들어 사용하는 것이 가장 쉬운 방법 일 것입니다. 그렇게 많을 거라고 생각하지 않습니다.


4

야, 나는 이것이 아마도 해결 된 주장이라는 것을 알고 있지만, 기껏해야 토착어 문법을 도출하는 위키피디아의 임시 문법 규칙을 사용하는 것보다 더 쉽게 해결할 수 있다고 생각합니다.

가장 좋은 해결책은 a 또는 an을 사용하여 다음 단어의 음소 기반 일치를 트리거하는 것입니다. 특정 음소는 항상 "an"과 연관되고 나머지는 "a"에 속합니다.

Carnegie Mellon University는 이러한 종류의 수표를위한 훌륭한 온라인 도구를 제공합니다-http: //www.speech.cs.cmu.edu/cgi-bin/cmudict 와 일치하는 39 개의 음소를 가진 125k 단어를 가지고 있습니다. 단어를 연결하면 전체 음소 세트가 제공되며 그중 첫 번째 만 중요합니다.

단어가 "NSA"와 같이 사전에 나타나지 않고 모두 대문자 인 경우 시스템은 해당 단어가 약어라고 가정하고 첫 글자를 사용하여 동일한 원래 규칙 세트를 기반으로 사용할 무기한 기사를 결정할 수 있습니다.


1
자원 경제성 측면에서 이것이 최선의 답이며, 이것이 제안 된 훨씬 더 데이터 집약적 인 방법보다 더 나쁜 성능을 보이는 이유를 알 수 없습니다.
Chthonic 프로젝트

3

@Nathan Long : wikipedia를 다운로드하는 것은 실제로 나쁜 생각이 아닙니다. 모든 이미지, 비디오 및 기타 미디어가 필요하지 않습니다.

저는 스웨덴 위키피디아 전체를 읽기 위해 PHP와 javascript (!)로 (엉뚱한) 프로그램을 썼습니다.

모든 단어와 내부 링크를 데이터베이스에 수집하고 모든 단어의 빈도를 추적했습니다. 이제 다양한 작업을위한 단어 데이터베이스로 사용합니다. * 주어진 문자 집합 (와일드 카드 포함)에서 생성 할 수있는 모든 단어 찾기 * 스웨덴어 용 간단한 구문 파일 생성 (데이터베이스에없는 모든 단어는 잘못된 것으로 간주 됨).

아, 그리고 전체 위키를 다운로드하는 데 약 일주일이 걸렸습니다. 10Mbit 연결로 대부분의 시간을 실행하는 랩톱을 사용했습니다.

당신이 그것에있을 때, 영어와 일치하지 않는 모든 사건을 기록하고 그중 일부가 실수인지 확인하십시오. 가서 고쳐서 커뮤니티에 돌려주세요.


2

Grammar Girl이 에피소드 A Versus An 에서 지적했듯이 미국 방언과 영국 방언에는 차이가 있습니다 .

한 가지 문제는 영어와 미국 영어에서 단어가 다르게 발음되는 경우입니다. 예를 들어, 특정 종류의 식물에 대한 단어는 미국 영어에서는 "erb"로, 영국 영어에서는 "herb"로 발음됩니다. 드물지만 이것이 문제가되는 경우, 귀하의 국가 또는 대부분의 독자가 예상하는 양식을 사용하십시오.




1

일반 알파벳으로 쓰여진 단어를 저장하는 영어 사전과 International Phoenetic 알파벳을 구할 수 있습니까?

그런 다음 phoenetics를 사용하여 단어의 시작 소리를 파악하고 "a"또는 "an"이 적절한 지 여부를 파악하십시오.

그것이 실제로 통계적 Wikipedia 접근 방식보다 쉬울 지 (또는 훨씬 재미 있을지) 확실하지 않습니다.


0

규칙 기반 알고리즘을 사용하여 최대한 많은 것을 처리 한 다음 예외 목록을 사용합니다. 멋지고 싶다면 예외 목록에서 몇 가지 새로운 "규칙"을 결정할 수 있습니다.


0

나는 단지 일련의 휴리스틱 스처럼 보입니다. 예를 들어 약어를 어떻게 처리합니까 ( "a RPM"또는 "an RPM"? 항상 후자가 더 합리적이라고 생각했습니다).

영어 단수 접두어를 처리하는 방법에 대해 이야기하는 언어 라이브러리에서 빠른 검색이 이루어졌지만 충분히 파헤 치면 무언가를 찾을 수있을 것입니다. 그리고 그렇지 않다면 항상 자신 만의 굴절 라이브러리를 작성하고 세계적으로 명성을 얻을 수 있습니다. :-).


RPM과 같은 약어는 문제가되지 않습니다. 당신이 말했듯이 그들은 어느 쪽이든 다룰 수 있습니다. 따라서 해결책은 분명합니다. 무시하십시오.
Andrew J. Brehm

나는 일치하지 않는 접두사를 유발하기 때문에 동의하지 않을 것입니다. 그냥 무시하면 "RPM"과 "UGC"가 발생하는데 이는 분명히 잘못된 것입니다.
Guss

0

나는 당신이 'a / an'과 같은 일부 보일러 플레이트를 한 단계 커버 올로 채울 수 있다고 생각하지 않습니다. 그렇지 않으면 'h'가있는 모든 단어와 같은 가정 오류가 발생합니다. 'o'로 진행하면 'home'과 같은 'a'대신 'an'을 얻습니다-(an home?). 기본적으로 영어의 논리를 포함하거나 가끔 어리석게 보일 드문 경우를 찾을 수 있습니다.


0

단어가 모음으로 시작하는지 자음으로 시작하는지 확인합니다. "u"는 일반적으로 자음과 모음 ( "yu")이므로 사용자의 목적을 위해 자음 그룹에 속합니다.

문자 "h"는 프랑스어와 영어로 사용되는 프랑스어 단어에서 gottal stop (자음)을 나타냅니다. 그 목록을 만들고 (사실 "명예", "명예", "시간"을 포함하여 충분할 수 있음) 모음으로 시작하는 것으로 계산할 수 있습니다 (영어는 성문 중지를 인식하지 못하기 때문입니다).

또한 "eu"를 자음 등으로 간주합니다.

너무 어렵지 않습니다.


0

an 또는 a의 선택은 단어가 발음되는 방식에 따라 다릅니다. 단어를 보면 용어 나 약어 등과 같이 정확한 발음을 말할 수는 없습니다. 방법 중 하나는 음소를 지원하는 사전을 가지고 단어와 관련된 음소 정보를 사용하여 "a "또는"an "을 사용해야합니다.


0

"a"와 "an"을 구분하는 데 적절한 정보가 있는지 확신 할 수 없지만 Princeton의 WordNet 데이터베이스는 비슷한 종류의 작업을 위해 정확하게 존재하므로 데이터가 거기에있을 가능성이 높습니다. . 그것은 수만 개의 단어와 상기 단어들 사이에 수십만 개의 관계를 가지고 있습니다 (IIRC; 사이트에서 현재 통계를 찾을 수 없습니다). 한번보세요. 무료로 다운로드 할 수 있습니다.


0

어떻게? 언제 어때? 기사가 첨부 된 명사를 가져옵니다. 특정 형태로 요청하십시오.

기사와 함께 명사를 요청하십시오. 많은 MUD 코드베이스는 다음으로 구성된 정보로 항목을 저장합니다.

  • 하나 이상의 키워드
  • 약식
  • 긴 형태

키워드 형식은 "Short Sword rusty"일 수 있습니다. 약식은 "검"입니다. 긴 형태는 "녹슨 단검"입니다.

"a vs. an"웹 서비스를 작성하고 있습니까? 한 발 물러서서이 유출을 더 상류에서 공격 할 수 있는지 살펴보십시오. 댐을 지을 수는 있지만 흐름을 멈추지 않으면 결국 넘칠 것입니다.

이것이 얼마나 중요한지 결정하고 다른 사람들이 제안한 것처럼 "빠르지 만 조잡한"또는 "비싸지 만 견고 함"을 선택하십시오.


0

규칙은 매우 간단합니다. 다음 단어가 모음 소리로 시작하면 'an'을 사용하고 자음으로 시작하면 'a'를 사용합니다. 어려운 점은 학교의 모음과 자음 분류가 작동하지 않는다는 것입니다. 'honour'의 'h'는 모음이지만 'hospital'의 'h'는 자음입니다.

설상가상으로 '정직'과 같은 일부 단어는 누가 말하는지에 따라 모음이나 자음으로 시작됩니다. 더 나쁜 것은 일부 화자의 주변 단어에 따라 일부 단어가 변경된다는 것입니다.

문제는 얼마나 많은 시간과 노력을 쏟고 싶은지에 의해서만 제한됩니다. 몇 분 안에 'aeiou'를 모음으로 사용하여 커플로 무언가를 쓰거나 타겟 청중에 대한 언어 분석을 수행하는 데 몇 달을 보낼 수 있습니다. 그들 사이에는 일부 화자에게는 옳고 다른 사람에게는 틀릴 수있는 수많은 휴리스틱이 있습니다. 그러나 서로 다른 화자들은 같은 단어에 대해 서로 다른 결정을 내리기 때문에 당신이 어떻게하든 항상 옳다는 것은 불가능합니다 그것.


0

이상적인 접근 방식은 답변을 제공하고 동적으로 쿼리하고 답변을 캐시 할 수있는 온라인 위치를 찾는 것입니다. 우선 수백 단어로 시스템을 준비 할 수 있습니다.

(저는 그런 온라인 소스에 대해 모르지만 하나가 있다고해도 놀라지 않을 것입니다.)


0

따라서 인터넷을 모두 다운로드하지 않고도 합리적인 솔루션이 가능합니다. 내가 한 일은 다음과 같습니다.

Google이 여기 에 Google Books N-Gram 주파수에 대한 원시 데이터를 게시 한 것을 기억했습니다 . 그래서 "a_"와 "an"에 대한 2 그램 파일을 다운로드했습니다. 제대로 기억하면 약 26 기가입니다. 그것으로부터 나는 당신이 기대하는 반대 기사가 압도적으로 앞에 오는 문자열 목록을 만들었습니다 (모음이 "an"을 기대한다면). 7 킬로바이트 미만으로 저장할 수있는 마지막 단어 목록입니다.


-2

다음 단어가 모음이 아닐 때마다 "a"를 사용합니까? 그리고 모음이있을 때마다 "an"을 사용합니까?

그렇다면 "a \ s [a, e, i, o, u]. *"와 같은 정규식을 수행 할 수 없습니까? 그런 다음 "an?"으로 바꾸십시오.


아니요, 규칙은 모음 문자가 아니라 모음 소리 에 관한 것 입니다. "User"는 모음으로 시작하지만 발음은 그렇지 않습니다.
Joris Groosman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.