在自然语言处理(NLP)领域,文本语言的识别是一项基础且重要的任务。对于任何需要处理未知文本的语言,首要任务是确定文本所使用的语言。幸运的是,这通常是NLP领域相对容易解决的挑战之一。本文介绍的方法是基于N-gram和单词出现频率的比较,适用于使用单词的语言。
语言检测是NLP中的一项基础任务。对于任何需要处理未知文本的语言,首要任务是确定文本所使用的语言。幸运的是,这通常是NLP领域相对容易解决的挑战之一。本文介绍的方法是基于N-gram和单词出现频率的比较,适用于使用单词的语言。
收集用于检测的语言的统计数据是实现语言检测的第一步。这并不像听起来那么简单。首先,需要收集大量只包含单一语言的测试数据(纯文本),并且这些数据不应该特定于某个领域。例如,报纸文章可能缺少“”这个词和直接引语的使用。使用莎士比亚的戏剧可能不是检测当代文本的最佳方法。医学文章往往包含太多特定于领域的术语,这些术语甚至不是语言特定的(如主要的、次要的、动脉等)。此外,这些文本不应该受到版权保护。
为了进行语言检测,需要为每种要检测的语言收集一组统计数据。这些数据包括字符集、N-gram和单词列表。一些语言有非常特定的字符集(例如,中文、日文和俄文);对于其他语言,某些字符可以很好地提示可能的语言(例如,德语的变音字母)。
一些语言有非常特定的字符集(例如,中文、日文和俄文);对于其他语言,某些字符可以很好地提示可能的语言(例如,德语的变音字母)。
在将文本标记化为单词(如果适用)之后,计算每个1、2和3-gram的出现次数。一些n-gram非常特定于语言(例如,英语中的"TH")。
最后一种消除歧义的来源是实际使用的单词。一些语言(如葡萄牙语和西班牙语)在使用的字符和特定n-gram的出现频率上几乎相同。然而,不同语言中使用的单词频率不同。
使用代码进行文本分类非常简单。首先,必须选择(或创建自己的)模型。ClassifyText方法返回一个ICategoryList,这是一个按分数降序排列的ICateogry(名称-分数对)项目列表。
using System;
class Program {
static void Main(string[] args) {
DialogueMaster.Babel.BabelModel model = DialogueMaster.Babel.BabelModel._AllModel;
String s = System.Console.ReadLine();
while (s.Length > 0) {
DialogueMaster.Classification.ICategoryList result = model.ClassifyText(s, 10);
foreach (DialogueMaster.Classification.ICategory category in result) {
System.Console.Out.WriteLine("{0} : {1}", category.Name, category.Score);
}
s = System.Console.ReadLine();
}
}
}
从现有语言集合中定义自己的模型非常简单,只需创建一个新的BabelModel并添加所需的语言即可。
class Program2 {
static void Main(string[] args) {
// Create a custom model
DialogueMaster.Babel.BabelModel model = new DialogueMaster.Babel.BabelModel();
model.Add("de", DialogueMaster.Babel.BabelModel._AllModel["de"]);
model.Add("en", DialogueMaster.Babel.BabelModel._AllModel["en"]);
model.Add("sv", DialogueMaster.Babel.BabelModel._AllModel["sv"]);
// ask the user for some input
String s = System.Console.ReadLine();
while (s.Length > 0) {
// classify it
DialogueMaster.Classification.ICategoryList result = model.ClassifyText(s, 10);
// and dump the result
foreach (DialogueMaster.Classification.ICategory category in result) {
System.Console.Out.WriteLine("{0} : {1}", category.Name, category.Score);
}
s = System.Console.ReadLine();
}
}
}
添加新语言非常简单。只需要一些学习数据文本。
class Program3 {
static void Main(string[] args) {
// Create a custom model
DialogueMaster.Babel.BabelModel model = new DialogueMaster.Babel.BabelModel();
TokenTable klingonTable = new TokenTable(new FileInfo("LearnData\\Klingon.txt"));
TokenTable vulcanTable = new TokenTable(new FileInfo("LearnData\\Vulcan.txt"));
model.Add("kling", klingonTable);
model.Add("vulcan", klingonTable);
model.Add("en", DialogueMaster.Babel.BabelModel._AllModel["en"]);
// ask the user for some input
String s = System.Console.ReadLine();
while (s.Length > 0) {
// classify it
DialogueMaster.Classification.ICategoryList result = model.ClassifyText(s, 10);
// and dump the result
foreach (DialogueMaster.Classification.ICategory category in result) {
System.Console.Out.WriteLine("{0} : {1}", category.Name, category.Score);
}
s = System.Console.ReadLine();
}
}
}
语言代码 | 语言 | 质量 | 默认 | 常见 | 大型 | 小型 |
---|---|---|---|---|---|---|
nl | 荷兰语 | 13 | x | x | x | x |
en | 英语 | 13 | x | x | x | x |
ca | 加泰罗尼亚语 | 13 | x | x | x | x |