2

英語の品詞のタグ付けをどのように判断するか、少し混乱しています。この場合、英語の 1 つの単語には 1 つのタイプがあると仮定します。たとえば、「book」という単語は、動詞ではなく名詞として認識されます。時制に基づいて英文を認識したい。たとえば、「I send the book」は過去時制として認識されます。

説明:

いくつかのデータベース (*.txt) ファイルがあります: NounList.txt、verbList.txt、adjectiveList.txt、adverbList.txt、connectionList.txt、prepositionList.txt、articleList.txt。そして、入力された単語がデータベースにある場合、それらの単語のタイプを推測できると思います。しかし、データベースでルックアップを開始するにはどうすればよいでしょうか? たとえば、「I sent the book」: データベースで、名詞としての「I」、動詞としての「sent」、冠詞としての「the」、名詞としての「book」のすべての単語の検索を開始するにはどうすればよいでしょうか? すべてのデータベースのすべての単語を検索するよりも良い方法はありますか? すべてのデータベースに独自の要素があるとは思えません。

ここに私の見解をまとめます。

private List<string> ParseInput(String allInput)
{
    List<string> listSentence = new List<string>();

    char[] delimiter = ".?!;".ToCharArray();
    var sentences = allInput.Split(delimiter, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim());

    foreach (var s in sentences)
        listSentence.Add(s);

        return listSentence;
}

private void tenseReviewMenu_Click(object sender, EventArgs e)
    {
        string allInput = rtbInput.Text;

        List<string> listWord = new List<string>();
        List<string> listSentence = new List<string>();

        HashSet<string> nounList = new HashSet<string>(getDBList("nounList.txt"));
        HashSet<string> verbList = new HashSet<string>(getDBList("verbList.txt"));
        HashSet<string> adjectiveList = new HashSet<string>(getDBList("adjectiveList.txt"));
        HashSet<string> adverbList = new HashSet<string>(getDBList("adverbList.txt"));

        char[] separator = new char[] { ' ', '\t', '\n', ',' etc... };         

        listSentence = ParseInput(allInput);

        foreach (string sentence in listSentence)
        {
            foreach (string word in sentence.Split(separator))
                if (word.Trim() != "")
                    listWord.Add(word);               
        }

        string testPOS = "";

        foreach (string word in listWord)
        {
            if (nounList.Contains(word.ToLowerInvariant()))
                testPOS += "noun ";
            else if (verbList.Contains(word.ToLowerInvariant()))
                testPOS += "verb ";
            else if (adjectiveList.Contains(word.ToLowerInvariant()))
                testPOS += "adj ";
            else if (adverbList.Contains(word.ToLowerInvariant()))
                testPOS += "adv ";

        }
        tbTest.Text = testPOS;
    }

POS のタグ付けは、私の課題における二次的な説明です。そこで、データベースに基づいた POS タグ付けを決定するために、単純なアプローチを使用します。しかし、より簡単なアプローチがある場合: 使いやすく、理解しやすく、疑似コードを取得しやすく、設計しやすい... POS タグ付けを決定するために、私に知らせてください。

4

1 に答える 1

1

以下に示す疑似コードがお役に立てば幸いです。時間があれば、コードも書きます。

この問題は、次の手順に従って対処できます。

  1. 英語のすべての一般的な文型の辞書を作成します。たとえば、件名 + 動詞は英語のパターンで、すべての文は , のようI sleepDog barkedなり、 SV パターンShip will arriveに一致します。最も一般的な英語のパターンのリストは、こちら にあります。プログラムの精度を高めるために、しばらくの間、この辞書を改訂し続ける必要があるかもしれないことに注意してください。

  2. 上記で作成した辞書のパターンの 1つに入力文を当てはめるようにしてください。たとえば、入力文がSnakes, unlike elephants, are venomous.の場合、コードは次のパターンに一致するものを見つけることができなければなりません: S`-, -VO . このステップを正常に実行するには、この例文のような単語のような構造マーカーを見つけるのに適したコードを記述する必要がある場合があります。Subject AnotherSubjectVerb Object

  3. パターン辞書で入力文に一致するものが見つかったら、文の各単語にタグを簡単に割り当てることができます。たとえば、この文では、単語Snakes主語elephantsとしてタグ付けされ、単語は動詞areとしてタグ付けされ、最後に目的語としてタグ付けされます。venomous

  4. 文の各単語に一意のタグを割り当てたら、既に持っている適切なテキスト ファイルで単語を検索し、文が有効かどうかを判断できます。

  5. 文がどの文型とも一致しない場合は、次の 2 つのオプションがあります。

    a) 有効な英文である場合、この認識されない文のパターンをパターン辞書に追加します。

    b) または、入力文を無効な英文として破棄します。

達成しようとしているようなことは、システムが新しいパターンを学習できるように、機械学習技術を使用して解決するのが最適です。そのため、既存のパターンのいずれとも一致しない有効な英文が見つかった場合に、新しいパターンをパターン ディクショナリに追加するトレーナー システムを含めることをお勧めします。これがどのように行われるかについてはあまり考えていませんが、今のところ、文型辞書を手動で修正できます。

この疑似コードについてのご意見をお待ちしております。

于 2013-03-25T20:41:10.250 に答える