如何分析 Java 中的字符串以判断它是一个单词还是完全乱码?

How to analyze a String in Java in order to tell if it is a word or total gibberish?

我需要分析 Java 中的字符串,以判断它是否包含乱码。

例如: "asdasx123ax" - 胡言乱语 "dsjkklcq" - 胡言乱语 “12das”——胡言乱语 "samarta" - 不是乱码(请注意,它不一定是字典中的真实单词才能被视为 "not gibberish") "karatko" - 不是乱码

基本上我要分析域名,我想要的算法可以给我一个特定域名是 spammy/robust/gibberish 域名的概率。

所以我更多地关注键盘混搭或类似猫的输入乱码。

P.S。我专注于英语语言。我会对不是 100% 精确的算法感到满意,如果它有时会出错,如果成功检测到乱码的概率(我上面定义的)> 0.6,我会认为它是满足我需要的可行算法。

也许 Java 中有库或算法可以解决这个问题?

对于英语,我是这样计算每个词的可信度得分的:

  • 合理的vowel/consonant比率奖励积分
  • 出现数字扣分
  • 存在常用字母组合的奖励积分("ee"、"oo"、"ey"、"th"、"ch"、"sh" , "qu")
  • 扣除常见键盘组合的分数("asdf"、"qwer"、"q" 后跟 "u" 以外的任何内容)等等。

然后我会得到一长串单词并对其进行微调。

既然你想把英语和胡言乱语区分开来;尝试使用某种形式的 approximate string matching 算法将单词与英语词典匹配。

您还可以提出一些关于单词结构的规则,例如,连续出现过多的辅音或元音将是乱码。

如果您有足够 "annotated" 数据,您可以使用某种监督机器学习方法,例如支持向量机(Java 实现:LIBSVM),已知其在文本分类任务中表现良好。

我会尝试

  • 收集数据并对其进行注释
  • 基于 n-gram 特征训练 SVM
  • (可能优化SVM模型)
  • 使用训练好的SVM检测"gibberish"和"not gibberish"(二分类)