• 统计英文文档里每个单词出现的次数


    最近想实现一个统计英文档单词出现次数的功能。

    查找规则是将文档里连续出现的<字母>判断为一个单词,如:“D) Let's go to d”,会将其判断为D、Let、s、go、to五个单词并统计出现的次数并不区分大小;

    //这个类用来存放出现的单词和其出现的次数
    public class WordNode
    {
      public string word;
      public int count;
    }
    
    /// <summary>
    /// 传入要统计的文本字符串,函数会返回WordNode列表,里面有文本字符串中出现的单词和单词出现的次数
    /// </summary>
    /// <param name="theSource"></param>
    /// <returns></returns>
    public List<WordNode> GetAllWord(string theSource)
    {
    //为了可以检索到最后一个单词,需在被检索字符串的末尾加一个非字母字符
    string source = theSource + "*";
    
    //取出字母的ascii码
    int aInt = 'a';
    int zInt = 'z';
    int AInt = 'A';
    int ZInt = 'Z';
    
    string getWord = string.Empty;
    WordNode wordNode;
    WordNode foundWordNode;
    List<WordNode> result = new List<WordNode>();
    int sourceLength = source.Length;
    int charCount = 0;
    for (int i = 0; i < sourceLength; i++)
    {
    if ((source[i] >= aInt && source[i] <= zInt) || (source[i] >= AInt && source[i] <= ZInt))//判断是不是字母
    {
    charCount++;//如果字符是字母则charCount加1
    }
    else
    {
    if (charCount > 0)
    {
    getWord = source.Substring(i - charCount, charCount);
    wordNode = new WordNode { word = getWord };
    
    //判断列表里有没有对应的词
    if (!result.Exists(x => x.word.Equals(wordNode.word, StringComparison.CurrentCultureIgnoreCase)))//不存在就把wordNode加进去
    {
    wordNode.count++;
    result.Add(wordNode);
    }
    else//存在就把对应的wordNode取出来,并把count加1;
    {
    foundWordNode = result.Find(x => x.word.Equals(wordNode.word, StringComparison.CurrentCultureIgnoreCase));
    foundWordNode.count++;
    }
    charCount = 0;
    }
    }
    }
    InsertSort(result, result.Count);
    return result;
    }
    
    /// <summary>
    /// 将统计过并返回的List<WordNode>按WordNode.count进行降序排序
    /// </summary>
    /// <param name="wordNodes"></param>
    /// <param name="count">值是wordNodes.count</param>
    public void InsertSort(List<WordNode> wordNodes, int count)
    {
    for (int i = 1; i < count; i++)
    {
    if (wordNodes[i].count > wordNodes[i - 1].count)
    { //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入 
    int j = i - 1;
    var x = wordNodes[i]; //复制为哨兵,即存储待排序元素 
    wordNodes[i] = wordNodes[i - 1]; //先后移一个元素 
    while ( j >= 0 && x .count > wordNodes[j].count)
    { //查找在有序表的插入位置 
    wordNodes[j + 1] = wordNodes[j];
    j--; //元素后移 
    }
    wordNodes[j + 1] = x; //插入到正确位置 
    }
    }
    }

    最后将将序排序过的统计结果wordNodes输出:

    下面截图是“D) Let's go to d”的统计结果

  • 相关阅读:
    NLP(二十一)根据已有文本LSTM自动生成文本
    Keras(五)LSTM 长短期记忆模型 原理及实例
    Keras(六)Autoencoder 自编码 原理及实例 Save&reload 模型的保存和提取
    NLP(二十) 利用词向量实现高维词在二维空间的可视化
    Keras(四)CNN 卷积神经网络 RNN 循环神经网络 原理及实例
    NLP(十六) DL在NLP中的应用
    Keras(三)backend 兼容 Regressor 回归 Classifier 分类 原理及实例
    ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (60000, 28, 28)
    Keras(二)Application中五款已训练模型、VGG16框架解读
    Python实现 下载IJCAI会议所有论文
  • 原文地址:https://www.cnblogs.com/z308805583/p/6684968.html
Copyright © 2020-2023  润新知