私は .NET アプリケーションを使用しており、名詞が指定された場合、その単語の前に "a" または "an" を正しく付けたいと考えています。どうすればいいですか?
最初の文字が母音かどうかを単純に確認することが答えだと考える前に、次のようなフレーズを考えてみてください。
- 正直な間違い
- 中古車
私は .NET アプリケーションを使用しており、名詞が指定された場合、その単語の前に "a" または "an" を正しく付けたいと考えています。どうすればいいですか?
最初の文字が母音かどうかを単純に確認することが答えだと考える前に、次のようなフレーズを考えてみてください。
おそらくこれよりもはるかに良くなることはできません - そして、それは確かにほとんどのルールベースのシステムを打ち負かすでしょう。
編集:これを JS/C# に実装しました。ブラウザで試すか、使用する再利用可能な小さな JavaScript 実装をダウンロードできます。.NET 実装はAvsAn
nugetのパッケージです。実装は簡単なので、必要に応じて他の言語に簡単に移植できます。
「ルール」は、私が思っていたよりもかなり複雑であることがわかりました。
...これは、ルールベースのシステムを構築するのが難しいことを強調するものです!
例外のリストを使用する必要があります。すべての例外が明確に定義されているわけではありません。言葉を話す人のアクセントに依存する場合があるからです。
ばかげた方法の 1 つは、(検索 API の 1 つを使用して) Google に 2 つの可能性を尋ね、最も人気のあるものを使用することです。
または:
したがって、「ヨーロッパ」と「誠実」が正しいバージョンです。
単語の綴りから単語の発音へのソースを見つけることができれば、次のようになります。
"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 で始まる頭字語について心配する必要があります。しかし、ウィキペディアのように、例外に追加するために使用できる頭字語リストがたくさんあります。
手動で実装し、必要な例外を追加する必要があります.
「a」と「an」はスペル規則ではなく音声規則によって決定されるため、おそらく次のようにします。
おっと、これはおそらく解決済みの議論であることは理解していますが、ウィキペディアのアドホックな文法規則を使用するよりも簡単に解決できると思います。
最良の解決策は、a または an を使用して、次の単語の音素ベースのマッチングをトリガーすることです。特定の音素は常に「an」に関連付けられ、残りは「a」に属します。
カーネギー メロン大学には、これらの種類のチェックのための優れたオンライン ツールがあります。単語を差し込むと、音素セット全体が提供されますが、重要なのは最初の 1 つだけです。
「NSA」などの単語が辞書に表示されず、すべて大文字である場合、システムはその単語が頭字語であると想定し、最初の文字を使用して、同じ元のルール セットに基づいて使用する不定冠詞を決定できます。
@Nathan Long: ウィキペディアをダウンロードすることは、実際には悪い考えではありません。すべての画像、ビデオ、その他のメディアは必要ありません。
私は PHP と javascript(!) で (くだらない) プログラムを書き、スウェーデン語のウィキペディア全体 (または少なくとも、私のスパイダーの出発点である数学に関する記事から到達できるすべての記事) を読みました。
データベースにすべての単語と内部リンクを収集し、すべての単語の頻度も追跡しました。私は今、それをさまざまなタスクの単語データベースとして使用しています: * 特定の文字セット (ワイルドカードを含む) から作成できるすべての単語を見つける * スウェーデン語用の単純な構文ファイルを作成しました (データベースにないすべての単語は正しくないと見なされます)。
ああ、wiki 全体をダウンロードするのに約 1 週間かかりました。ほとんどの時間、ラップトップを 10Mbit 接続で実行していました。
それができたら、英語と矛盾するすべての発生をログに記録し、それらのいくつかが間違いであるかどうかを確認します. それらを修正して、コミュニティに何かを還元してください。
Grammar Girl がエピソードA Versus Anで指摘したように、アメリカとイギリスの方言には違いがあることに注意してください。
問題の 1 つは、イギリス英語とアメリカ英語で単語の発音が異なる場合です。たとえば、特定の種類の植物を表す単語は、アメリカ英語では「erb」、イギリス英語では「herb」と発音されます。これが問題となるまれなケースでは、あなたの国または大多数の読者によって期待されるフォームを使用してください。
Perl のLingua::EN::Inflectを見てください。sub _indef_article
ソースコードを参照してください。
通常のアルファベットと国際フェネティック アルファベットで書かれた単語を格納する英語の辞書を入手できますか?
次に、音声学を使用して、単語の最初の音を把握し、「a」と「an」のどちらが適切かを判断します。
それがウィキペディアの統計的アプローチよりも実際に簡単かどうか (または同じくらい楽しいかどうか) はわかりません。
ルールベースのアルゴリズムを使用してできるだけ多くをカバーしてから、例外のリストを使用します。気を付けたい場合は、例外リストからいくつかの新しい「ルール」を決定してみてください。
私はヒューリスティックのセットのように見えます。それはもう少し複雑で、私が良い答えを得ることができなかったいくつかの事柄に答える必要があります。たとえば、略語をどのように扱うか(「RPM」または「RPM」?私は常に後者の方が理にかなっていると思いました)。
クイック検索では、英語の単数接頭辞の処理方法について説明している言語ライブラリが見つかりましたが、十分に掘り下げれば、おそらく何かを見つけることができます。そうでない場合は、いつでも独自の語形変化ライブラリを作成して、世界的に有名になることができます:-)。
ワンステップカバーとして「a/an」のようなボイラープレートを埋めることができるとは思いません。そうしないと、「h」が付いたすべての単語が「home」のような「a」ではなく「o」get「an」で進むような仮定エラーが発生します-(ホーム?)。基本的に、あなたは英語の論理を含めることになるか、時にはあなたが愚かに見えるようになるまれなケースを見つけるでしょう。
どのように?いつですか?冠詞が付いた名詞を取得します。特定のフォームでそれを求めてください。
冠詞とともに名詞を尋ねます。多くの MUD コードベースは、アイテムを次の情報として格納します。
キーワードの形は「短剣錆び」かもしれません。省略形は「剣」になります。ロングフォームは「さびついた短刀」になります。
"a vs. an" Web サービスを作成していますか? 一歩下がって、このリークをさらに上流で攻撃できるかどうかを確認してください。ダムを作ることはできますが、流れを止めなければいつかはあふれ出してしまいます。
これがどれほど重要かを判断し、他の人が示唆しているように、「迅速だが粗雑」または「高価だが頑丈」を選びます。
単語が母音または子音で始まるかどうかを確認します。「う」は一般的に子音と母音(「ゆ」)なので、子音グループに属します。
文字「h」は、フランス語および英語で使用されるフランス語の単語で、ゴットストップ (子音) を表します。それらのリストを作成し (実際、「honor」、「honour」、および「hour」を含めれば十分かもしれません)、それらを母音から始まるものとして数えることができます (英語は声門の停止を認識しないため)。
「eu」も子音などに数えます。
それほど難しくありません。
したがって、インターネット全体をダウンロードしなくても、合理的な解決策が可能です。これが私がしたことです:
Google が Google ブックスの N-Gram 頻度の生データをここで公開したことを思い出しました。そこで、「a_」と「an」の 2 グラムのファイルをダウンロードしました。私の記憶が正しければ、約 26 ギガです。それから、予想される反対の冠詞が圧倒的に先行する文字列のリストを作成しました (母音に「an」が付くと予想される場合)。7 キロバイト未満に格納できた単語の最終的なリスト。
理想的なアプローチは、回答を提供できるオンラインの場所を見つけ、動的にクエリを実行し、回答をキャッシュすることです。手始めに、数百語でシステムを準備できます。
(そのようなオンライン ソースは知りませんが、存在しても驚かないでしょう。)
an または a の選択は、単語の発音方法によって異なります。単語を見ても、専門用語や略語などの正しい発音を必ずしも判断できるとは限りません。音素をサポートする辞書を用意し、単語に関連付けられた音素情報を使用して、「a " または "an" を使用する必要があります。
「a」と「an」を区別するための適切な情報が含まれているかどうかは定かではありませんが、プリンストンのWordNetデータベースは、まさに同様の種類のタスクを目的として存在しているため、データがそこにある可能性が高いと思います。 . 数万の単語と、その単語間の数十万の関係があります (IIRC; サイトで現在の統計を見つけることができません)。見てください。無料でダウンロードできます。
ルールはとても簡単です。次の単語が母音で始まる場合は「an」、子音で始まる場合は「a」を使用します。難しいのは、私たちの学校の母音と子音の分類が機能しないことです。「honour」の「h」は母音ですが、「hospital」の「h」は子音です。
さらに悪いことに、'honest' のようないくつかの単語は、誰が言っているのかによって、母音または子音で始まります。さらに悪いことに、話者によっては周囲の言葉に応じて変化する言葉もあります。
問題は、どれだけの時間と労力を費やすかによってのみ制限されます。母音として「aeiou」を使用して何かを数分で書くことも、ターゲット オーディエンスの言語分析に数か月を費やすこともできます。それらの間には、一部の話者にとっては正しく、他の話者にとっては間違っている膨大な数のヒューリスティックがあります。それ。
次の単語が母音でない場合はいつでも「a」を使用しますか? 母音があるときはいつでも「an」を使いますか?
ということで、「a\s[a,e,i,o,u].*」のような正規表現ができませんか?そして、それを「an?」に置き換えます。