自然语言处理 (高斯消元模板)

在自然语言处理领域,有一种算法叫做词嵌入向量(Word Embedding)法,算法的核心便是将语言抽象成代数中矩阵的形式进行运算。而其中一种很重要的方法便是词频统计法,该方法通过统计一段文本中每个单词出现的频数、建立文本段落的词频向量来确定文本的特征。其中词频向量是一个 ​1 x m的矩阵,其中每个分量都对应着某个单词的出现次数。

下面将给出若干段由小写英文字母组成的文本内容,请你通过上文描述的词频统计法计算出每段文本对应的词频向量,再判断这些向量所构成的向量组是否满足线性相关性质......

但是,善良的龙龙不忍心让你做这么繁琐又无聊的字符串处理工作。于是他偷偷帮你处理出了所有文本的词频向量,剩下的工作交给你了!

输入描述

第一行输入一个正整数 ​T [1,100],表示数据组数。

接下来 ​T 组数据,每组数据将输入 ​n+1 行,第一行输入两个正整数 ​n [1,10] 和 ​m [1,4] ,分别表示有 ​n 段文本,他们的词频向量维度都是 m ​。

接下来 ​n 行,每行输入m​ 个非负整数,相邻两个整数由空格间隔开,其中第 ​i 行的输入表示龙龙帮你处理完的第 ​i 段文本的词频向量是 ​A\left [ i \right ]=\left \{ a_{1} ,a_{2},...,a_{m}\right \} 的形式,保证 0<=ai<=100​。

输出描述

对于每组数据,请输出一行,如果这些词频向量组满足线性相关的性质,则请输出YES,如果它们线性无关则请输出NO,注意换行。

 

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 1↵
  2. 2 2↵
  3. 1 1↵
  4. 0 1↵
以文本方式显示
  1. NO↵
2秒64M0

 

#include<stdio.h>  
#include<stdlib.h>  
#include<math.h>  
int main(){  
    int team;  
    scanf("%d",&team);  
    int n,m,pivotrow,nonzero,i,j,k;  
    float temp;  
    float a[20][20];  
    while(team--)  
    {  
        for(i=0;i<20;i++)  
        {  
            for(j=0;j<20;j++)  
            a[i][j]=0;  
        }  
        nonzero=0;  
        scanf("%d%d",&n,&m);  
        for(i=1;i<=n;++i)  
        {     
            for(j=1;j<=m;j++)  
            {  
                scanf("%f",&a[j][i]);  
            }  
         }  
        for(i=1;i<=m-1;i++)  
        {  
            pivotrow=i;  
            for(j=i+1;j<=m;j++)  //寻找头值域最小的那一行   
            {  
                if(fabs(a[j][i])>fabs(a[pivotrow][i])) pivotrow=j;  
            }  
            for(k=i;k<=n;k++)  //将第i行和标记行调换   
            {  
                temp=a[i][k];  
                a[i][k]=a[pivotrow][k];  
                a[pivotrow][k]=temp;  
            }  
            for(j=i+1;j<=n;j++)  
            {  
                if(a[i][i]==0) break; // 排除零行   
                temp=a[j][i]/a[i][i];  
                for(k=i;k<=n;k++)  
                {  
                    a[j][k]-=a[i][k]*temp;  
                }  
            }  
        }  
        if(m>n) m=n;  
        for(i=1;i<=m;i++)  
        {  
            if(fabs(a[i][i]-0)>0.001) nonzero++;  
            //printf("%d\n",a[i][i]);  
        }  
      
        if(nonzero==n) printf("NO\n");  
        else printf("YES\n");  
    }  
}  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值