如何判断一个字符串是随机生成的还是可能是英文单词?

7

我有一些文本语料库,其中包含一些字符串。在这些字符串中,有些是英语单词,有些是随机的,例如VmsVKmGMY6eQE4eMI,每个字符串中的字符数量没有限制。

有没有什么方法可以测试一个字符串是否是英语单词?我正在寻找一种算法来完成这项工作。这是Java语言,我不想实现额外的字典。


1
你并不需要实现一个字典,只需要使用一个即可。 - Rob Neuhaus
你是否也期望匹配像 foo1oksana0grishuk3evgeny1platov1 中的金牌得主这样的东西? - Has QUIT--Anony-Mousse
我只是需要一个方法来确定一个字符串是否为英文单词。 - ikel
“Muggle”是一个英语单词吗?“Hobbit”是一个英语单词,还是J.R.R.托尔金编造的东西?“北京”或“Peking”是英语单词,还是对中文名称的英语转写?至于“John”,它是一个英语单词吗? - Has QUIT--Anony-Mousse
1
你提到的都是关键词,只要不是随意的文本就可以。 - ikel
7个回答

4
我曾为一个源代码挖掘项目解决了一个相关问题,虽然该包是用Python而不是Java编写的,但如果它仍然有用的话,在这里提一下似乎也值得。该包名为Nostril(“无意义字符串评估器”),旨在确定在源代码挖掘过程中提取的字符串是否可能是类/函数/变量等标识符或随机胡言乱语。Nostril不使用字典,但它确实包含一个相当大的n-gram频率表,以支持其对文本字符串的概率评估。
例如:以下代码,
from nostril import nonsense
real_test = ['bunchofwords', 'getint', 'xywinlist', 'ioFlXFndrInfo',
             'DMEcalPreshowerDigis', 'httpredaksikatakamiwordpresscom']
junk_test = ['faiwtlwexu', 'asfgtqwafazfyiur', 'zxcvbnmlkjhgfdsaqwerty']
for s in real_test + junk_test:
    print('{}: {}'.format(s, 'nonsense' if nonsense(s) else 'real'))

将会产生以下输出:
bunchofwords: real
getint: real
xywinlist: real
ioFlXFndrInfo: real
DMEcalPreshowerDigis: real
httpredaksikatakamiwordpresscom: real
faiwtlwexu: nonsense
asfgtqwafazfyiur: nonsense
zxcvbnmlkjhgfdsaqwerty: nonsense

该项目在GitHub上,欢迎贡献。如果您确实需要Java实现,也许我们可以使Nostril兼容Python 2.7,并尝试使用Jython从Java运行它。


看起来这个软件包已经有一段时间没有更新了。有没有更新的版本? - wordsforthewise

3

1
如果您是指一些基于经验的规则,可以将英文单词与随机文本区分开来,那么这种规则是不存在的。为了达到合理的准确度,您需要查询外部数据源,无论是网络、词典还是服务。
如果您只需要检查某个单词是否存在,我建议使用Wordnet。它非常简单易用,并且有一个很好的Java API叫做JWNL,使用它可以轻松地查询Wordnet字典。

WordNet 已经多年没有更新了,不确定其性能如何。 - ikel

0

你不能不使用某种字典来完成这个任务。

1)我想到的一件事是以编程方式运行Google搜索这个词。如果它是一个英语单词,你会得到很多页面。如果它是一个随机字符串,你就不会得到那么多页面。但是你仍然使用Google作为字典。你需要使用一些启发式方法,并为返回的页面计数设置一些阈值。

2)另一种可能的方法是找到一些英语字典网络服务(免费或付费),从你的程序中调用。那么你就不需要在你的程序中保存字典,只需要调用外部网络服务即可。检查这个。字典网络服务建议


0

很遗憾,您无法实现一个可以识别有效英语单词的语法而不使用字典。 英语语言就不能以这种方式建模。

如果您想要实现这一点,可以创建一个包含有效英语单词的数据库,并查询它以检查其有效性。 为了加快这个过程,您可以使用正则表达式来筛选出以下单词:

  1. 包含数字和字母
  2. 包含超过一个大写字母

我相信也有现成的API可供使用,以避免自己实现这个功能。但总的来说,这就是这个过程。


0
我建议使用像 Jazzy http://jazzy.sourceforge.net/demo.html 这样的插件。它是一个拼写检查器,但它可以告诉你随机字符串是否在字典中。不幸的是,该字典已经过时了几年,所以您需要手动添加到其中。

0
我建议你研究一下自然语言处理。现在有多种语言版本,而且具备许多功能,可以帮助你确定提供的文本的“语言水平”程度。

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接