2017年华东师范大学校赛

来源:互联网 发布:阿里云快照是什么意思 编辑:程序博客网 时间:2024/04/19 23:25

題目鏈接

題意簡述如下:

給定一篇字母形式的真實語料,判斷是英文,是中文還是日文。

在解題之前,我先大喊三聲計算語言學大法好,在別人的博客裏看到華師校賽有這樣的題目我就興奮地跑過來馬上A掉了。出題人腦洞很大啊。

數據給的是真實語料,所以語言特徵是很明顯的。因此,我們觀察一下文本規律即可。

英文的規律:

有如下不符合其他兩種語言拼寫方式的特徵詞,一旦出現即可判定:is, are, in, and。

中文(拼音)的規律:

聲母最多兩個字母,韻母最多三個字母。所以,單詞長度絕對是不會超過5的。爲了保險起見我們設定長度閾值爲6,即:若整篇文章所有的單詞的長度都不超過6,就判定爲中文。(這個長度閾值只能往大裏改,而不能往小裏改。)

日文(羅馬音)就不需要找規律了,剩下的就是日文。文本中的單詞可以以如下方式存在:

  1. 單獨元音。
  2. 連續的元音。
  3. 輔音+元音。
  4. (3)和其他形態的組合,其中可能含有連續的輔音(拗音及促音)。

這些都無所謂了(逃)。

代碼如下:

#include<bits/stdc++.h>using namespace std;main(){    string s;    int len_less_than_six = 1;    while(cin >> s){        for(int i = 0;i<s.size();i++){            if(s[i] == '.'|| s[i] == '\'' || s[i] == '?' || s[i] == ','||(s[i]>='0' &&  s[i]<='9')) {                s[i] = '\0';                break;            }        }        if(s == "is" || s == "are" || s == "in" || s == "and"){ cout << "English" << endl;return 0;}        if(s.size()>6) len_less_than_six = 0;    }    if(len_less_than_six) cout << "Chinese" << endl;    else cout << "Japanese" << endl;}

評注:

真實的語言識別遠遠沒有這麼簡單。拉丁語系的語言,區分起來應該需要不小的語料。

還是要計算一下特徵向量……