根据数据库文件确定英文的POS标记

时间:2013-03-24 02:49:35

标签: c# nlp part-of-speech

我对如何确定英语词性标注感到有点困惑。在这种情况下,我假设英语中的一个单词有一种类型,例如单词“book”被识别为NOUN,而不是VERB。我想基于时态识别英语句子。例如,“我发送的书”被认为是过去式。

说明

我有许多数据库(* .txt)文件:NounList.txt,verbList.txt,adjectiveList.txt,adverbList.txt,conjunctionList.txt,prepositionList.txt,art​​icleList.txt。如果输入单词在数据库中可用,我假设可以得出这些单词的类型。但是,如何在数据库中开始查找?例如,“我发了书”:如何在数据库中开始搜索每个单词,“我”作为名词,“发送”作为动词,“the”作为文章,“书”作为名词?比搜索每个数据库中的每个单词更好的方法?我怀疑每个数据库都有独特的元素。

我把我的观点放在这里。

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标记,请告诉我。

1 个答案:

答案 0 :(得分:1)

我希望我在下面提到的伪代码证明对你有帮助。如果我找时间,我也会为你写一些代码。

可以通过以下步骤解决此问题:

  1. 创建英语中所有常见句型的字典。例如,主题+动词是英语模式,I sleepDog barkedShip will arrive等所有句子都匹配 SV模式 。您可以找到最常见的英语模式列表here。请注意,有些时候您可能需要不断修改此词典以提高程序的准确性。

  2. 尝试将输入句子放在上面创建的词典中的一个模式中,例如,如果输入句子是Snakes, unlike elephants, are venomous.,那么您的代码必须能够找到与模式:Subject ,与 AnotherSubjectVerb Object S-不同,不像-S`-,-VO 。要成功执行此步骤,您可能需要编写擅长发现结构标记的代码,例如不同,在此示例句中。

  3. 如果在模板词典中找到了输入句子的匹配项,则可以轻松地为句子中的每个单词指定一个标记。例如,在我们的句子中,单词Snakes会被标记为主题,就像单词elephants一样,单词are会被标记为动词,最后将venomous这个词标记为对象

  4. 为句子中的每个单词指定唯一标记后,您可以在已有的相应文本文件中查找单词,并确定您的句子是否有效。

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

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

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

  6. 您尝试实现的目标最好使用机器学习技术解决,以便系统学习任何新模式。因此,您可能希望包含一个训练器系统,只要找到与任何现有模式不匹配的有效英语句子,就会在模式字典中添加新模式。我没有想过如何做到这一点,但是现在,你可以手动修改你的Sentence Pattern字典。

    我很高兴听到您对此伪代码的看法,并可以进一步集思广益。