題意簡述如下:
給定一篇字母形式的真實語料,判斷是英文,是中文還是日文。
在解題之前,我先大喊三聲計算語言學大法好,在別人的博客裏看到華師校賽有這樣的題目我就興奮地跑過來馬上A掉了。出題人腦洞很大啊。
數據給的是真實語料,所以語言特徵是很明顯的。因此,我們觀察一下文本規律即可。
英文的規律:
有如下不符合其他兩種語言拼寫方式的特徵詞,一旦出現即可判定:is, are, in, and。
中文(拼音)的規律:
聲母最多兩個字母,韻母最多三個字母。所以,單詞長度絕對是不會超過5的。爲了保險起見我們設定長度閾值爲6,即:若整篇文章所有的單詞的長度都不超過6,就判定爲中文。(這個長度閾值只能往大裏改,而不能往小裏改。)
日文(羅馬音)就不需要找規律了,剩下的就是日文。文本中的單詞可以以如下方式存在:
- 單獨元音。
- 連續的元音。
- 輔音+元音。
- (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;
}
評注:
真實的語言識別遠遠沒有這麼簡單。拉丁語系的語言,區分起來應該需要不小的語料。
還是要計算一下特徵向量……