2

我有点困惑如何确定英语的词性标记。在这种情况下,我假设英语中的一个单词有一种类型,例如单词“book”被识别为 NOUN,而不是 VERB。我想根据时态识别英语句子。例如,“I sent 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. 创建英语中所有常见句型的字典。例如,Subject + Verb是一个英语模式,所有的句子都喜欢I sleepDog barked并且Ship will arrive匹配SV 模式您可以在此处找到最常见的英语模式列表。请注意,您可能需要在一段时间内不断修改这本词典以提高程序的准确性。

  2. 尝试将输入句子拟合到您在上面创建的字典中的一种模式中,例如,如果输入句子是Snakes, unlike elephants, are venomous.,那么您的代码必须能够找到与该模式匹配的:、Subject不同S-,unlike- S`-, -VO。要成功执行此步骤,您可能需要编写擅长识别结构标记的代码,例如本例中的单词distinctAnotherSubjectVerb Object

  3. 当您在模式词典中找到与输入句子匹配的内容时,您可以轻松地为句子中的每个单词分配一个标签。例如,在我们的句子中,单词Snakes将被标记为主,就像单词一样,单词将被标记为动词,最后单词将被标记为宾语elephantsarevenomous

  4. 一旦您为句子中的每个单词分配了唯一标签,您就可以在已有的相应文本文件中查找该单词并确定您的句子是否有效。

  5. 如果您的句子与任何句型都不匹配,那么您有两种选择:

    a) 如果它是有效的英语句子,则在您的模式词典中添加这个无法识别的句子的模式。

    b) 或者,将输入句子作为无效的英语句子丢弃。

使用机器学习技术可以最好地解决您想要实现的目标,以便系统可以学习任何新模式。因此,您可能希望包含一个培训系统,该系统会在找到与任何现有模式都不匹配的有效英语句子时将新模式添加到您的模式字典中。我没有过多考虑如何做到这一点,但现在,您可以手动修改您的句型字典。

我很高兴听到您对这个伪代码的意见,并且可以进一步集思广益。

于 2013-03-25T20:41:10.250 回答