単語の前に「a」と「an」を正しく付けるにはどうすればよいですか?


92

私は.NETアプリケーションを持っていて、名詞を与えられたときに、その単語の前に「a」または「an」を正しく付けたいと思っています。どうすればいいですか?

答えが最初の文字が母音であるかどうかを確認するだけであると考える前に、次のようなフレーズを検討してください。

  • 正直な間違い
  • 中古車

4
また、 "a NHL"のような "a"や "an"にも混乱を招く可能性のある略語を考慮する必要があります。これは、文字の音も母音で始まりますが、略語がそのような単語として発音できる場合はそうではありません。 「NASデバイス」または「NASCARイベント」
JBキング

5
また、aまたはanの使用は、話されているさまざまな英語の特定の発音に依存する可能性があることに注意してください。イギリスとアメリカのハーブの発音はその一例です。
エリック

12
@エリック:確かに、これの私のお気に入りの例(オタクも)は「SQL」です。「SQL」という文字を言う人もいれば、「続編」のように発音する人もいます。それぞれが異なる「a」または「an」を取得します。たとえば、「それはSQLステートメントです」と「続編のステートメント」の
比較

さらに難しいのは、同じ英語の方言でも意見が異なることです。したがって、たとえば、公式(英国)の英語では「ホテル」が正しい構造であることがわかりますが、ほとんどの人は日常会話で「ホテル」を使用します。あなたがそれを書けば、それは私たちの残りの人にとって非常に役に立ちます!
h4xxr 2009

あ…「志願H」。初めての出会いを鮮やかに覚えています。植民地時代のウィリアムズバーグに関する本、「歴史協会」と題された2年生の社会科書。
Bob Kaufman、

回答:


137
  1. ウィキペディアをダウンロード
  2. それを解凍して、記事のテキストのみを出力するクイックフィルタープログラムを作成します(ダウンロードは通常、記事以外のメタデータとともにXML形式です)。
  3. a(n)....のすべてのインスタンスを検索し、次の単語とそのすべての接頭辞にインデックスを作成します(これには単純な接尾辞トライを使用できます)。これは大文字と小文字を区別する必要があり、最大語長-15文字が必要ですか?
  4. (オプション)5回未満発生するすべてのプレフィックスを破棄するか、「a」対「an」が2/3未満の過半数(または他のしきい値-ここで微調整)を達成する場合。コーナーケースを回避するために、空のプレフィックスを保持することをお勧めします。
  5. 親が同じ "a"または "an"アノテーションを共有するすべてのプレフィックスを破棄することにより、プレフィックスデータベースを最適化できます。
  6. 「A」または「AN」のどちらを使用するかを決定するときは、一致する最長のプレフィックスを見つけ、その先頭に従います。手順4で空のプレフィックスを破棄しなかった場合は、常に一致するプレフィックス(つまり、空のプレフィックス)が存在します。それ以外の場合は、完全に一致しない文字列の特殊なケースが必要になることがあります(このような入力は非常にまれです)。 。

あなたはおそらくこれよりはるかに良くなることはできません-そしてそれは確かにほとんどのルールベースのシステムを打ち負かします。

編集:私はきたJS / C#でこれを実装。あなたはできるブラウザでそれを試して、またはそれが使用する小型の、再利用可能なJavaScriptの実装をダウンロードしてください。.NET実装はAvsAnnugetのパッケージです。実装は簡単なので、必要に応じて他の言語に簡単に移植できます。

「ルール」は思ったよりもかなり複雑であることがわかりました。

  • それはだ、予期しない結果が、それはだ満場一致
  • それ正直な決断ですがスイカズラ低木
  • 記号:それは0800番号、またはオレガノの∞。
  • 略語:それはNASAの科学者が、NSAのアナリスト、FIAT車が、FAAの方針。

...ルールベースのシステムを構築するのは難しいと強調するだけです!


そして、この出力から名詞が欠落している場合、確かに単純なルールエンジンにフォールバックできます。
ジョンフィッシャー

26
Wikipediaのダウンロードが(現在のところ)2.8テラバイトに解凍されることを考えると、この方法を使用する誰かが結果のデータを公に投稿し、プロセスをあまり繰り返す必要がないとすばらしいでしょう。
ネイサンロング

10
この答えは完全に深刻ではありませんでしたが、私はこのようなことをしました、そしてwikipediaの未加工のwikimarkupを含む.xmlファイルは、わずか40GB(最新のものは常に少し大きい)で、2.8TBではありません-すべて1つのファイル-展開された.htmlバージョンやイメージをダウンロードしないでください。2.8TBのバージョンでしょうか。いずれにせよ、マークアップを気にしない限り、実際に解析することはかなり可能です。
Eamon Nerbonne、2009

1
これは、私が考えることができる最も簡単に入手できる最新の自然言語データセットの1つです。ただし、他のデータソースももちろん問題ありません。アルゴリズムは、結局のところ、ウィキペディアに依存していません。あなたはhome.nerbonne.org/A-vs-Anまたは私のブログ
Eamon Nerbonne

1
私がして越えて、このソリューションに感動します。正直に言って、ウィキペディア全体をダウンロードするよりもはるかに簡単だと思いました。よくできました。+1
Kehlan Krumme 2014年

15

例外のリストを使用する必要があります。例外のすべてが明確に定義されているとは思いません。それは、単語を話す人のアクセントに依存する場合があるためです。

愚かな方法の1つは、Googleに2つの可能性(検索APIの1つを使用)を要求し、最も人気のあるものを使用することです。

または:

したがって、「ヨーロッパ」と「正直」が正しいバージョンです。


6
これは実際に使用が許可されているのですか、それとも禁止されているのですか?IIRCでは、そのような定期的な使用は確かに避けられます。
Eamon Nerbonne、2009

1
@イーモン:興味深い点。アプリケーションが以前にグーグルで検索したすべての単語の記録を保持している場合は、出会う新しい単語ごとに1回だけグーグルする必要がありますか?それでも、Googleの使用には疑問がありますか?
gnovice

2
明らかな技術的な問題(このような自動化された方法での検索エンジン出力の使用は許可されておらず、すぐにブロックされます)を除いて、これは問題を正しい方法で解決しません-最悪の場合、一般的な誤用を複製します構文。
ガス

6
最悪の場合?「よくある誤用」を複製することは、自然言語システムが努力すべきことと全く同じであるというかなり強い議論があります。ロブスター考慮して、デビッドフォスターウォレスのエッセイ「権威とアメリカの使用法」を参照してください。Googleよりも使用するコーパスが優れていますが、それは別の問題です。
ロバートロスニー2009

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で始まるものについて心配する必要があります。しかし、ウィキペディアのように、例外に追加するために使用できる頭字語のリストはたくさんあります。


2
自分を助けることはできませんが、hawr-uh-buhlいつも私を笑わせます。
IllidanS4はモニカを2014

9

手動で実装し、必要な例外を追加する必要があります。たとえば、最初の文字が「H」で、その後に「O」(正直、時間など)が続きます。また、ヨーロッパ、大学、中古などの反対のものも続きます。


1
うん本当の男。間違いだったと思います。それはまったく規則がない
Ahmad Farid

8

「a」と「an」はスペル規則ではなく音声規則によって決定されるため、おそらく次のようにします。

  1. 単語の最初の文字が子音の場合-> 'a'
  2. 単語の最初の文字が母音の場合-> 'an'
  3. rjumnroが言うように、例外(心臓、X線、家)のリストを保持します

5

不定冠詞の文法規則を確認する必要があります(英語の文法には不定冠詞が2つしかありません-"a"と "an"です)これらは正しいとは思わないかもしれませんが、英語の文法の規則は非常に明確です:

「aとanの単語は不定冠詞です。母音(a、e、i、o、u)で始まる不定冠詞an before単語と子音で始まる不定冠詞a before単語(すべて他の文字)。」

これは母音の意味注意音を母音ではなく、手紙を。たとえば、「名誉」や「相続人」などの無音の「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」に関連付けられ、残りは「a」に属します。

カーネギーメロン大学には、これらの種類のチェックのための優れたオンラインツール(http://www.speech.cs.cmu.edu/cgi-bin/cmudict)があり、一致する39の音素で125k語を使用できます。単語を接続すると、音素セット全体が提供されますが、そのうち最初の音だけが重要です。

「NSA」などの単語が辞書に表示されておらず、すべて大文字の場合、システムはその単語を頭字語と見なし、最初の文字を使用して、同じ元のルールセットに基づいて、使用する不定冠詞を決定できます。


1
リソースの節約という点では、これが最良の答えです。提案されているはるかにデータ集約的な方法よりもパフォーマンスが低下する理由はわかりません。
Chthonicプロジェクト

3

@ネイサン・ロング:ウィキペディアをダウンロードすることは実際に悪い考えではありません。すべての画像、動画、その他のメディアは必要ありません。

私はphpとjavascript(!)で(くだらない)プログラムを作成して、スウェーデンのウィキペディア全体(または少なくとも、数学についての記事から到達できたすべてのariclesを読んだ。これが私のスパイダーの始まりだった。)

データベース内のすべての単語と内部リンクを収集し、すべての単語の頻度も追跡しました。私は現在、さまざまなタスクの単語データベースとして使用しています。

ああ、そしてWiki全体をダウンロードするのに約1週間かかりました。私のラップトップを10Mビットの接続でほとんどの時間実行しています。

それができたら、英語と一致しないすべての発生を記録し、それらのいくつかが間違いかどうかを確認します。修正してコミュニティに何かを返しましょう。


2

文法少女が彼女のエピソードA対Anで指摘したように、アメリカとイギリスの方言には違いがあることに注意してください。

複雑さの1つは、イギリス英語とアメリカ英語で単語の発音が異なる場合です。たとえば、ある種の植物の単語は、アメリカ英語では「erb」と発音され、イギリス英語では「herb」と発音されます。これが問題となるまれなケースでは、あなたの国または読者の大多数が期待するフォームを使用してください。



2

Pythonから関数を移植しました(当初はCPANパッケージLingua-EN-Inflectから)。これは、C#で母音を正しく決定し、それを質問への回答として投稿しました。ここにコードスニペットが表示されます


1

私たちの通常のアルファベットで書かれた単語を格納する英語の辞書と、国際的表現アルファベットか?

次に、表現論を使用して、単語の最初の音を理解し、したがって「a」または「an」が適切かどうかを判断します。

それが実際にウィキペディアの統計的手法よりも簡単であるか(またはそれと同じくらい楽しいか)はわかりません。


0

ルールベースのアルゴリズムを使用してできる限り多くをカバーし、例外のリストを使用します。ファンシーになりたい場合は、例外リストからいくつかの新しい「ルール」を決定してみてください。


0

私はヒューリスティックのセットのように見えます。それはもう少し複雑で、たとえば、略語をどのように処理するか(たとえば、「RPM」または「RPM」?

英語の単数プレフィックスを処理する方法について語る言語ライブラリーで簡単な検索が行われましたが、十分に掘り下げれば、おそらく何かを見つけることができます。そしてそうでなければ-あなたはいつでもあなた自身の活用ライブラリーを書いて世界的な名声を得ることができます:-)。


RPMのような省略形は問題ではありません。あなたが言うように、彼らはどちらの方法でも扱うことができます。したがって、解決策は明白です。それらを無視してください。
Andrew J. Brehm

一貫性のない接頭辞が発生するため、同意しません。それを無視するだけでは、明らかに「間違っている」「RPM」と「UGC」が発生します。
ガウス

0

私は、「a / an」のようなボイラープレートの要素を1つのステップのカバーオールとして埋めることができるとは思いません。そうしないと、「h」で始まるすべての単語が「home」のような「a」ではなく「o」で「an」を取得するなどの仮定エラーが発生します-(家?)。基本的に、あなたは英語の論理を含むことになるか、あなたがばかげているように見えるまれなケースを時々見つけるでしょう。


0

単語が母音または子音で始まるかどうかを確認します。「u」は通常、子音と母音(「yu」)であるため、目的に応じて子音グループに属します。

文字「h」は、フランス語および英語で使用されるフランス語の単語での終止符(子音)を表します。それらのリストを作成し(実際には、「名誉」、「名誉」、「時間」で十分かもしれません)、それらを母音で始まるものとして数えることができます(英語は声門停止を認識しないため)。

また、「eu」も子音として数えます。

難しいことではありません。


0

anまたはaの選択は、単語の発音方法によって異なります。単語を見ると、必ずしもその正確な発音がわかるわけではありません。たとえば、専門用語や略語などです。音素をサポートする辞書を用意し、その単語に関連付けられている音素情報を使用して「a "または" an "を使用する必要があります。


0

「a」と「an」を区別するのに適切な情報が含まれていることは確かではありませんが、プリンストンのWordNetデータベースは、類似した種類のタスクの目的で正確に存在するため、データがそこにあると考えられます。それは数万の言葉とそれらの言葉の間の数十万の関係を持っています(IIRC;私はサイトで現在の統計を見つけることができません)。見てください。自由にダウンロードできます。


0

どうやって?いつですか?記事が添付された名詞を取得します。特定の形でそれを求めます。

記事で名詞を尋ねます。多くのMUDコードベースは、次のもので構成される情報としてアイテムを格納します。

  • 1つ以上のキーワード
  • 短い形式
  • 長い形

キーワード形式は「さびた短剣」かもしれません。ショートフォームは「刀」になります。長い形は「さびた短剣」になります。

「a対an」のWebサービスを作成していますか?一歩下がって、このリークをさらに上流で攻撃できるかどうかを確認します。ダムを建設することはできますが、ダムの流れを止めないと、やがて溢れ出します。

これがどれほど重要であるかを判断し、他の人が示唆しているように、「迅速だが粗雑」または「高価だが頑丈」に進んでください。


0

ルールは非常に簡単です。次の単語が母音で始まる場合は「an」を使用し、子音で始まる場合は「a」を使用します。難しいのは、学校での母音と子音の分類が機能しないことです。「名誉」の「h」は母音ですが、「病院」の「h」は子音です。

さらに悪いことに、「正直」のようないくつかの言葉は、誰が言っているかに応じて、母音または子音で始まります。さらに悪いことに、話者によっては、周囲の言葉によって変化する言葉もあります。

問題は、どれだけの時間と労力を費やしたいかによってのみ制限されます。「aeiou」を母音として数分で使用して、カップルで何かを書くことができます。または、ターゲットオーディエンスの言語分析に何ヶ月も費やすことができます。それらの間には、いくつかの話者にとっては正しいが他の人にとっては間違っている膨大な数のヒューリスティックがあります-しかし、話者が異なれば同じ単語に対して異なる決断をするため、どのようにしても常に正しいとは限りません。それ。


0

理想的なアプローチは、回答を提供し、動的にクエリを実行し、回答をキャッシュできるオンラインの場所を見つけることです。最初に数百語でシステムを準備できます。

(そのようなオンラインソースは知りませんが、オンラインソースがあったとしても驚かないでしょう。)


0

したがって、インターネットをすべてダウンロードしなくても、合理的な解決策が可能です。これが私がしたことです:

GoogleがGoogleブックスのN-Gram周波数の生データをここに公開したことを思い出しました。「a_」と「an」の2グラムのファイルをダウンロードしました。正しく思い出せば約26ギグです。それから、あなたが期待するはずの反対の記事が圧倒的に先行する文字列のリストを作成しました(母音が「an」をとることを期待する場合)。その最終的な単語リストは、7キロバイト未満で保存できました。


-2

次の単語が母音でないときはいつでも「a」を使用しますか?そして、母音があるときはいつでも "an"を使用しますか?

そうは言っても、「a \ s [a、e、i、o、u]。*」のような正規表現を実行できませんでしたか?そして、それを「an?」に置き換えます。


いいえ、ルールは母音についてですので、、ない母音の手紙。「ユーザー」は母音で始まりますが、発音はしません。
Joris Groosman、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.