尝试测量文本中每个字母的出现次数。对于英语和德语文本,计算频率和分布。获得这些数据后,您可以推断出您的文本频率分布所属的语言。
您应该使用贝叶斯推断来确定最接近的语言(具有一定的误差概率),或者可能有其他统计方法可用于此类任务。
1 / ABS(RankInUnknown - RankInLanguage + 1)
。除了ä、ö、ü和ß(eszett)外,英语和德语使用相同的字母集。您可以寻找这些字母来确定语言。
您还可以查看Grefenstette的此文本(比较两种语言识别方案)。它查看字母三元组和短单词。德语常见的三元组是en_、er_、_de。英语常见的三元组是the_、he_、the...
还有Bob Carpenter的LingPipe如何执行语言标识?
语言检测在概念上并不是很困难。请查看我对一个相关问题的回答以及其他对同一问题的回复。
如果你想自己尝试编写,你应该能够在半天内编写一个简单的检测器。我们在工作中使用类似以下算法的东西,它的效果出奇的好。还要阅读我链接的文章中的python实现教程。
步骤:
取两种语言的文本并提取字符级别的二元组、三元组和以空格分隔的标记(单词)。跟踪它们的频率。这一步构建了两种语言的“语言模型”。
给定一段文本,识别每个语料库中的字符二元组、三元组和以空格分隔的标记及其相应的“相对频率”。如果模型中缺少特定的“特征”(字符二元组/三元组或标记),则将其“原始计数”视为1,并用来计算其“相对频率”。
特定语言的相对频率的乘积给出该语言的“得分”。这是一个非常天真的近似,表示该句子属于该语言的概率。
得分更高的语言获胜。
a X b = exp(log(a)+log(b))
http://msdn.microsoft.com/en-us/library/dd317700(v=VS.85).aspx
如果您想从.NET访问此内容,这里提供了一些相关信息:
http://windowsteamblog.com/blogs/developers/archive/2009/05/18/windows-7-managed-code-apis.aspx
希望有所帮助。对于这两种语言的停用词方法是快速的,通过对不出现在另一种语言中的单词进行加重,例如德语中的“das”和英语中的“the”,可以使其更快。使用“独占性词语”将有助于在更大的语言群体中强有力地推广此方法。
你可以使用Google语言检测API。
这里有一个使用它的小程序:
baseUrl = "http://ajax.googleapis.com/ajax/services/language/detect"
def detect(text):
import json,urllib
"""Returns the W3C language code of a natural language"""
params = urllib.urlencode({'v': '1.0' , "q":text[0:3000]}) # only use first 3000 characters
resp = json.load(urllib.urlopen(baseUrl + "?" + params))
try:
retText = resp['responseData']['language']
except:
raise
return retText
def test():
print "Type some text to detect its language:"
while True:
text = raw_input('#> ')
retText = detect(text)
print retText
if __name__=='__main__':
import sys
try:
test()
except KeyboardInterrupt:
print "\n"
sys.exit(0)
其他有用的参考资料:
Google宣布API(和演示): http://googleblog.blogspot.com/2008/03/new-google-ajax-language-api-tools-for.html
Python包装器: http://code.activestate.com/recipes/576890-python-wrapper-for-google-ajax-language-api/
另一个Python脚本: http://www.halotis.com/2009/09/15/google-translate-api-python-script/
RFC 1766定义了W3C语言
从以下网址获取当前语言代码: http://www.iana.org/assignments/language-subtag-registry
如果你只需要选择两种语言(英语和德语),那么问题不是容易了几个数量级吗?在这种情况下,你的停用词列表方法可能已经足够好了。
显然,如果你添加更多语言到你的列表中,你需要考虑重写。