私は.NETアプリケーションを持っていて、名詞を与えられたときに、その単語の前に「a」または「an」を正しく付けたいと思っています。どうすればいいですか?
答えが最初の文字が母音であるかどうかを確認するだけであると考える前に、次のようなフレーズを検討してください。
- 正直な間違い
- 中古車
私は.NETアプリケーションを持っていて、名詞を与えられたときに、その単語の前に「a」または「an」を正しく付けたいと思っています。どうすればいいですか?
答えが最初の文字が母音であるかどうかを確認するだけであると考える前に、次のようなフレーズを検討してください。
回答:
あなたはおそらくこれよりはるかに良くなることはできません-そしてそれは確かにほとんどのルールベースのシステムを打ち負かします。
編集:私はきたJS / C#でこれを実装。あなたはできるブラウザでそれを試して、またはそれが使用する小型の、再利用可能なJavaScriptの実装をダウンロードしてください。.NET実装はAvsAn
nugetのパッケージです。実装は簡単なので、必要に応じて他の言語に簡単に移植できます。
「ルール」は思ったよりもかなり複雑であることがわかりました。
...ルールベースのシステムを構築するのは難しいと強調するだけです!
例外のリストを使用する必要があります。例外のすべてが明確に定義されているとは思いません。それは、単語を話す人のアクセントに依存する場合があるためです。
愚かな方法の1つは、Googleに2つの可能性(検索APIの1つを使用)を要求し、最も人気のあるものを使用することです。
または:
したがって、「ヨーロッパ」と「正直」が正しいバージョンです。
次のような単語の発音に対する単語のスペルのソースを見つけることができた場合:
"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で始まるものについて心配する必要があります。しかし、ウィキペディアのように、例外に追加するために使用できる頭字語のリストはたくさんあります。
hawr-uh-buhl
いつも私を笑わせます。
手動で実装し、必要な例外を追加する必要があります。たとえば、最初の文字が「H」で、その後に「O」(正直、時間など)が続きます。また、ヨーロッパ、大学、中古などの反対のものも続きます。
「a」と「an」はスペル規則ではなく音声規則によって決定されるため、おそらく次のようにします。
不定冠詞の文法規則を確認する必要があります(英語の文法には不定冠詞が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';
}
ルールを作成してから例外のリストを作成してそれを使用するのがおそらく最も簡単です。そんなに多くなるとは思いません。
確かに、これはおそらく解決された議論であることは理解していますが、ウィキペディアのアドホックな文法規則を使用するよりも簡単に解決できると思います。
最良の解決策は、aまたはトリガーを使用して、次の単語の音素ベースのマッチングを行うことです。特定の音素は常に「an」に関連付けられ、残りは「a」に属します。
カーネギーメロン大学には、これらの種類のチェックのための優れたオンラインツール(http://www.speech.cs.cmu.edu/cgi-bin/cmudict)があり、一致する39の音素で125k語を使用できます。単語を接続すると、音素セット全体が提供されますが、そのうち最初の音だけが重要です。
「NSA」などの単語が辞書に表示されておらず、すべて大文字の場合、システムはその単語を頭字語と見なし、最初の文字を使用して、同じ元のルールセットに基づいて、使用する不定冠詞を決定できます。
@ネイサン・ロング:ウィキペディアをダウンロードすることは実際に悪い考えではありません。すべての画像、動画、その他のメディアは必要ありません。
私はphpとjavascript(!)で(くだらない)プログラムを作成して、スウェーデンのウィキペディア全体(または少なくとも、数学についての記事から到達できたすべてのariclesを読んだ。これが私のスパイダーの始まりだった。)
データベース内のすべての単語と内部リンクを収集し、すべての単語の頻度も追跡しました。私は現在、さまざまなタスクの単語データベースとして使用しています。
ああ、そしてWiki全体をダウンロードするのに約1週間かかりました。私のラップトップを10Mビットの接続でほとんどの時間実行しています。
それができたら、英語と一致しないすべての発生を記録し、それらのいくつかが間違いかどうかを確認します。修正してコミュニティに何かを返しましょう。
PerlのLingua :: EN :: Inflectを見てください。sub _indef_article
ソースコードを見てください。
私たちの通常のアルファベットで書かれた単語を格納する英語の辞書と、国際的表現アルファベットか?
次に、表現論を使用して、単語の最初の音を理解し、したがって「a」または「an」が適切かどうかを判断します。
それが実際にウィキペディアの統計的手法よりも簡単であるか(またはそれと同じくらい楽しいか)はわかりません。
私はヒューリスティックのセットのように見えます。それはもう少し複雑で、たとえば、略語をどのように処理するか(たとえば、「RPM」または「RPM」?
英語の単数プレフィックスを処理する方法について語る言語ライブラリーで簡単な検索が行われましたが、十分に掘り下げれば、おそらく何かを見つけることができます。そしてそうでなければ-あなたはいつでもあなた自身の活用ライブラリーを書いて世界的な名声を得ることができます:-)。
私は、「a / an」のようなボイラープレートの要素を1つのステップのカバーオールとして埋めることができるとは思いません。そうしないと、「h」で始まるすべての単語が「home」のような「a」ではなく「o」で「an」を取得するなどの仮定エラーが発生します-(家?)。基本的に、あなたは英語の論理を含むことになるか、あなたがばかげているように見えるまれなケースを時々見つけるでしょう。
単語が母音または子音で始まるかどうかを確認します。「u」は通常、子音と母音(「yu」)であるため、目的に応じて子音グループに属します。
文字「h」は、フランス語および英語で使用されるフランス語の単語での終止符(子音)を表します。それらのリストを作成し(実際には、「名誉」、「名誉」、「時間」で十分かもしれません)、それらを母音で始まるものとして数えることができます(英語は声門停止を認識しないため)。
また、「eu」も子音として数えます。
難しいことではありません。
どうやって?いつですか?記事が添付された名詞を取得します。特定の形でそれを求めます。
記事で名詞を尋ねます。多くのMUDコードベースは、次のもので構成される情報としてアイテムを格納します。
キーワード形式は「さびた短剣」かもしれません。ショートフォームは「刀」になります。長い形は「さびた短剣」になります。
「a対an」のWebサービスを作成していますか?一歩下がって、このリークをさらに上流で攻撃できるかどうかを確認します。ダムを建設することはできますが、ダムの流れを止めないと、やがて溢れ出します。
これがどれほど重要であるかを判断し、他の人が示唆しているように、「迅速だが粗雑」または「高価だが頑丈」に進んでください。
ルールは非常に簡単です。次の単語が母音で始まる場合は「an」を使用し、子音で始まる場合は「a」を使用します。難しいのは、学校での母音と子音の分類が機能しないことです。「名誉」の「h」は母音ですが、「病院」の「h」は子音です。
さらに悪いことに、「正直」のようないくつかの言葉は、誰が言っているかに応じて、母音または子音で始まります。さらに悪いことに、話者によっては、周囲の言葉によって変化する言葉もあります。
問題は、どれだけの時間と労力を費やしたいかによってのみ制限されます。「aeiou」を母音として数分で使用して、カップルで何かを書くことができます。または、ターゲットオーディエンスの言語分析に何ヶ月も費やすことができます。それらの間には、いくつかの話者にとっては正しいが他の人にとっては間違っている膨大な数のヒューリスティックがあります-しかし、話者が異なれば同じ単語に対して異なる決断をするため、どのようにしても常に正しいとは限りません。それ。
次の単語が母音でないときはいつでも「a」を使用しますか?そして、母音があるときはいつでも "an"を使用しますか?
そうは言っても、「a \ s [a、e、i、o、u]。*」のような正規表現を実行できませんでしたか?そして、それを「an?」に置き換えます。