我有一个包含一些字符串的文本语料库。在这些字符串中,有些是英文单词,有些是随机的,如VmsVKmGMY6eQE4eMI,每个字符串中的字符数没有限制。
有没有办法测试一个字符串是否是英文单词?我正在寻找一种能够完成这项工作的算法。这是Java,我宁愿不实现额外的字典。
答案 0 :(得分:2)
如果你的意思是某种拇指规则将英语单词与随机文本区分开来,那就没有了。为了获得合理的准确性,您需要查询外部源,无论是Web,字典还是服务。
如果您只需要检查该单词的存在,我建议Wordnet。它使用起来非常简单,并且有一个很好的Java API,称为JWNL,它使查询Wordnet词典变得轻而易举。
答案 1 :(得分:2)
如果你想要区分那些字样但可能不够流行的字体来自乱码/随机文字,那实际上并不难。你应该看到我对这个问题的回答。 Is there any way to detect strings like putjbtghguhjjjanika?。它包含一个Python和PHP实现。
答案 2 :(得分:0)
如果不使用某种字典,就不能这样做。
1)我想到的一件事是以编程方式为此单词运行Google搜索。如果它是英文单词,您将获得大量页面。如果它是一个随机字符串,你就不会获得那么多页面。但是,您仍然使用Google作为字典。您需要使用一些启发式方法并为返回的页数设置一些阈值。
2)另一种可能的方法是找到一些你从程序中调用的英语词典Web服务(免费或付费)。然后,您不会在程序中保留字典,只需调用该外部Web服务即可。检查一下。 Dictionary webservice recommendation
答案 3 :(得分:0)
不幸的是,如果没有字典,就无法实现识别有效英语单词的语法。英语不能以这种方式建模。
如果您想实现此目的,您可以创建一个包含有效英语单词的数据库,只需查询它以检查其有效性。为了加快这个过程,您可以使用正则表达式来清除以下单词:
我确信您也可以使用现有的API来避免自己实现。但总的来说,就是这个过程。
答案 4 :(得分:0)
我建议使用像Jazzy http://jazzy.sourceforge.net/demo.html这样的插件。它是一个拼写检查器,但它可以判断随机字符串是否在字典中。不幸的是,字典已经过时了几年,所以你必须手动添加它。
答案 5 :(得分:0)
我必须为源代码挖掘项目解决一个密切相关的问题,尽管该软件包是用Python而不是Java编写的,但似乎值得一提,以防它以某种方式仍然有用。包是Nostril(对于" Nonsense String Evaluator")并且它旨在确定在源代码挖掘期间提取的字符串是否可能是类/函数/变量/等。标识符或随机乱码。 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运行它。