web-dev-qa-db-ja.com

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

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

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

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

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

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

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

  • an予期しない結果ですが、a満場一致です
  • それはan正直な決定ですが、aスイカズラ低木です
  • 記号:an0800の数値、またはan∞のオレガノです。
  • 頭字語:aNASAの科学者ですが、anNSAアナリスト;aFIAT車だがanFAAポリシー。

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

135
Eamon Nerbonne

例外のリストを使用する必要があります。それは時々御言葉を言う人のアクセントに依存するので、すべての例外が明確に定義されているとは思いません。

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

または:

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

15
rjmunro

次のように、Wordの発音に対するWordのスペルのソースを見つけることができたとします。

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

15
Anon

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

9
Ahmad Farid

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

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

不定冠詞の文法規則を確認する必要があります(英語の文法には不定冠詞が2つしかありません-"a"と "an"。あなたはこれらの正しい音に同意しないかもしれませんが、 英語の文法は非常にクリア

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

これは母音soundを意味し、母音letterではないことに注意してください。たとえば、「名誉」や「相続人」などの無音の「h」で始まる単語は母音として扱われるため、「an」で始まります。たとえば、「はじめまして」です。子音で始まる単語には、「中古車」ではなく「中古車」という接頭辞が付けられます。

したがって、プログラマーとして、これらは従うべきルールです。どのような文字ではなく、Wordがどのような音で始まるかを判断する方法を考え出すだけです。 Jaimie Sirovichによる PHPのthis などの例を見てきた:

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

おそらくルールを作成してから、例外のリストを作成してそれを使用するのが最も簡単です。そんなに多くなるとは思いません。

5
Dan Diplo

確かにこれはおそらく解決された議論だと思いますが、せいぜい自国語の文法を導き出すウィキペディアのアドホックな文法規則を使用するよりも簡単に解決できると思います。

最良の解決策は、aまたはトリガーを使用して、次のWordの音素ベースのマッチングを行うことです。特定の音素は常に「an」に関連付けられ、残りは「a」に属します。

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

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

4
knownhuman

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

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

データベース内のすべての単語と内部リンクを収集し、すべての単語の頻度も追跡しました。これをさまざまなタスクのWordデータベースとして使用します。*特定の文字セット(ワイルドカードを含む)から作成できるすべての単語を検索します*スウェーデン語の単純な構文ファイルを作成しました(データベースにないすべての単語は正しくないと見なされます)。

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

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

3

私は Python から関数を移植しました(当初はCPANパッケージLingua-EN-Inflectから)。これは、C#で母音を正しく決定し、質問への回答として投稿しました プログラムで決定するかどうかオブジェクトをaまたはan? で記述します。コードスニペット here を確認できます。

2
Stuart

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

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

2
Jan Aagaard

Perlの Lingua :: EN :: Inflect を見てください。見る sub _indef_articleソースコード内。

2
Sinan Ünür

私たちの通常のアルファベットで書かれた単語を格納する英語の辞書と International Phoenetic Alphabet を入手できますか?

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

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

1
Paul D. Waite

anまたはaの選択は、Wordの発音方法によって異なります。単語を見ても、必ずしも正しい発音がわかるとは限りません。専門用語や略語など。音素をサポートする辞書を用意し、Wordに関連付けられた音素情報を使用して「a」または「an」のどちらを使用するかを決定する方法の1つ。

0
Rohin

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

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

0
Hot Licks

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

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

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

0
KayEss

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

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

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

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

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

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

0
maxwellb

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

0
A. L. Flanagan

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

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

0
Guss

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

0
Badfish

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

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

0
IngisKahn

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

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

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

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

0
Andrew J. Brehm

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

0
rmeador