我对如何确定英语词性标注感到有点困惑。在这种情况下,我假设英语中的一个单词有一种类型,例如单词“book”被识别为NOUN,而不是VERB。我想基于时态识别英语句子。例如,“我发送的书”被认为是过去式。
说明
我有许多数据库(* .txt)文件:NounList.txt,verbList.txt,adjectiveList.txt,adverbList.txt,conjunctionList.txt,prepositionList.txt,articleList.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标记,请告诉我。
答案 0 :(得分:1)
我希望我在下面提到的伪代码证明对你有帮助。如果我找时间,我也会为你写一些代码。
可以通过以下步骤解决此问题:
创建英语中所有常见句型的字典。例如,主题+动词是英语模式,I sleep
,Dog barked
和Ship will arrive
等所有句子都匹配 SV模式 。您可以找到最常见的英语模式列表here。请注意,有些时候您可能需要不断修改此词典以提高程序的准确性。
尝试将输入句子放在上面创建的词典中的一个模式中,例如,如果输入句子是Snakes, unlike elephants, are venomous.
,那么您的代码必须能够找到与模式:Subject
,与 AnotherSubject
,Verb
Object
或 S-不同,不像-S`-,-VO 。要成功执行此步骤,您可能需要编写擅长发现结构标记的代码,例如与不同,在此示例句中。
如果在模板词典中找到了输入句子的匹配项,则可以轻松地为句子中的每个单词指定一个标记。例如,在我们的句子中,单词Snakes
会被标记为主题,就像单词elephants
一样,单词are
会被标记为动词,最后将venomous
这个词标记为对象。
为句子中的每个单词指定唯一标记后,您可以在已有的相应文本文件中查找单词,并确定您的句子是否有效。
如果您的句子与任何句型都不匹配,那么您有两种选择:
a)如果这是一个有效的英语句子,请在模板词典中添加这个无法识别的句子的模式。
b)或者,将输入的句子作为无效的英语句子丢弃。
您尝试实现的目标最好使用机器学习技术解决,以便系统学习任何新模式。因此,您可能希望包含一个训练器系统,只要找到与任何现有模式不匹配的有效英语句子,就会在模式字典中添加新模式。我没有想过如何做到这一点,但是现在,你可以手动修改你的Sentence Pattern字典。
我很高兴听到您对此伪代码的看法,并可以进一步集思广益。