c# - 如何使用 C# 检查文本文件中是否存在名词?

我试图在 C# 中找到一个库,它可以帮助我进行词性标记以从句子中识别名词,但无济于事。所以我决定根据我下载的文本文件中的名词列表检查字符串中的单词。我的代码假设句子中的第一个名词是动词所指的名词,我假设这是因为网站上留下的大多数评论都不由很多单词组成。所以这是我尝试将文本拆分为一个数组,然后遍历 noun.txt 文件中的每个名词,看看我的字符串是否存在。我的代码如下,我只想返回 The first noun foundNo noun detected 作为我的方法的返回类型。

string DetectNoun(string param){
  //split the input parameter into words based on spaces
  string[] words=param.ToLower().Split(" ");
  //read all the nouns in the text file into an array:NB all nouns are in lower case
  string[] allNouns=File.ReadAllLines("Nouns.txt");
  //loop through each noun in the array and check if any exists in our input parameter
  int j=0;
  for(int i=0;i>allNouns.Length;i++){
   if(allNouns[i]==words[j++]){
      //return this word as the noun found
       return allNouns[i];
     }
  }
  //if no match was found return no noun detected
  return "No noun detected";
}

使用 Samsung Television, No manual, Box included 的示例输入在上面进行了测试。尽管电视在我刚刚下载的名词的文本文件中,但它仍然返回 No noun was detected

回答1

您的原始代码有几个问题:

  1. 你是按空格分割的,所以在你的情况下,你会得到(例如),television, 在你的单词列表中带有一个逗号。比较时,您将 televisiontelevision, 进行比较,因此不匹配。

  2. 您正在使用 == 进行比较,这在比较字符串时会“令人困惑”,您应该使用正确的字符串比较器。

  3. 您的 for 循环已损坏,您只是在比较索引与索引(第一个词与第一个名词,第二个词与第二个名词等)...此外,如果您的名词列表小于您的单词列表,这将引发 IndexOutOfRange 异常

要解决所有这些问题:

  1. 在拆分之前从字符串中删除所有不需要的字符。我推荐一个正则表达式(Regex.Replace(input, @"[^a-zA-Z\d ]", ""),但您需要检查它是否适合您的输入(特别是如果接收非 a-Z 字母数字字符,如重音符号或变音符号等)

  2. 使用 StringComparer.OrdinalIgnoreCase 或 StringComparison.OrdinalIgnoreCase 而不是 ToLower()ToLower() 通常在处理英语以外的文化时不是正确的方法

  3. 我会使用 Linq 并用它制作一条线:

words.FirstOrDefault(x => allNouns.Contains(x, StringComparer.OrdinalIgnoreCase);

如果 words 中的 no 单词包含在 allNouns 中,则返回 null,否则返回第一个匹配项。

把它们放在一起:

string DetectNoun(string param){
  string[] words = Regex.Replace(param, @"[^a-zA-Z\d ]", "").Split(' ');
  // You should cache this somewhere if you plan to call this many times,
  // but I'll leave that up to you
  string[] allNouns=File.ReadAllLines("Nouns.txt");
  return words.FirstOrDefault(x => allNouns.Contains(x, StringComparer.OrdinalIgnoreCase)) 
            ?? "No noun detected";
}

相似文章

最新文章