Python:查找列表中的某些单词是实际英文单词还是接近英文单词

问题描述:

我正在处理一个问题,其中列出了发生频率的大量单词。这里是我所得到的一个样本:Python:查找列表中的某些单词是实际英文单词还是接近英文单词

drqsQAzaQ:1 
OnKxnXecCINJ:1 
QoGzQpg:1 
cordially:1 
Sponsorship:1 
zQnpzQou:1 
Thriving:1 
febrero:1 
rzaye:1 
VseKEX:1 
contributed:1 
SNfXQoWV:1 
hRwzmPR:1 
Happening:1 
TzJYAMWAQUIJTkWYBX:1 
DYeUIqf:1 
formats:1 
eiizh:1 
wIThY:1 
infonewsletter:8 
BusinessManager:10 
MailScanner:12 

正如你可以看到,像话“亲切”是实际的英语单词,而像“infonewsletter”字本身并不是实际的英语单词,但我们可以看到,他们实际上是英语,并且意味着什么。然而,像'OnKxnXecCINJ'这样的单词并不意味着什么(实际上它们是来自另一个字符集的单词,但我在练习中忽略了它们并坚持英语) - 我可以丢弃它们作为垃圾

什么是最好的方法在Python中检测并消除给定词典中的垃圾词,例如上面的那个?

我试着使用nltk.corpus.word.words()检查每个单词,但是由于我的数据集非常庞大,它正在破坏我的表现。此外,我不确定这是否会给我一个像“infonews”

请帮助。

谢谢, Mahesh。

+1

安置自己的代码,以便我们可以帮助你很好。 – NiviD

如果字是从内部完全不同的脚本的UnicodeCJK字符或希腊语,俄语,泰语,你可以使用unicodedata.category,看看他们是字母开头(类与L开始):

>>> import unicodedata 
>>> unicodedata.category('a') 
'Ll' 
>>> unicodedata.category('E') 
'Lu' 
>>> unicodedata.category('中') 
'Lo' 
>>> [unicodedata.category(i).startswith('L') for i in 'aE中,'] 
[True, True, True, False] 

然后你就可以使用unicodedata.name看到他们拉丁字母:

>>> 'LATIN' in unicodedata.name('a') 
True 
>>> 'LATIN' in unicodedata.false('中') 
False 

假设它不是一个英文单词,如果它有非拉丁字母的话。


否则,您可以使用字母bigram/trigram分类器来确定这些英文单词是否有很高的概率。例如OnKxnXecCINJ包含Kxn这是一个三元组,既不可能存在于任何单个英语单词中,也不是任何2个单词的串联。

您可以通过将单词拆分为字符三联体来从语料库中自行构建一个,也可以使用任何现有的库,如langdetectlangid左右。

此外,请参见快速in操作的语料库是set;只有在算法告诉我们很有可能使用英文,并且在set中找不到该单词时,才会认为它与infonewsletter相似 - 多个单词的串联;将它递归地分成更小的块,并且看到它的每个部分都在语料库中找到。

谢谢。我正在尝试这种方法。但是,我有一个问题。我有一个词'vdgutumvjaxbpz'。我知道这是垃圾。我写了一些代码来获得所有克这个单词,4克和更高。这就是结果:

['vdgu','dgut','gutu','utum','tumv','umvj','mvja','vjax','jaxb','axbp', 'xbpz', 'vdgut', 'dgutu', 'gutum', 'utumv', 'tumvj', 'umvja', 'mvjax', 'vjaxb', 'jaxbp', 'axbpz', 'vdgutu',“dgutum ”, 'gutumv', 'utumvj', 'tumvja', 'umvjax', 'mvjaxb', 'vjaxbp', 'jaxbpz', 'vdgutum', 'dgutumv', 'gutumvj', 'utumvja', 'tumvjax', 'umvjaxb','mvjaxbp','vjaxbpz','vdgutumv','dgutumvj','gutumvja','utumvjax','tumvjaxb','umvjaxbp','mvjaxbpz','vdgutumvj','dgutumvja','gutumvjax ','utumvjaxb','tumvjaxbp','umvjaxbpz','vdgutumvja','dgutumvjax','gutumvjaxb','utumvjaxbp','tumvjaxbpz','vdgutumvjax','dgutumvjaxb','gutumvjaxbp','utumvjaxbpz', 'vdgutumvjaxb','dgutumvjaxbp','gutumvjaxbpz','vdgutumvjaxbp','dgutumvjaxbpz','vdgutumvjaxbpz']

现在,我们将每个gram结果与nltk.corpus.words.words()进行比较,并找到2个集合的交集。

vocab = nltk.corpus.words.words() 
vocab = set(w.lower().strip() for w in vocab) 

def GetGramsInVocab(listOfGrams, vocab): 
    text_vocab = set(w.lower() for w in listOfGrams if w.isalpha()) 
    common = text_vocab & vocab 
    return list(common) 

但是,交集包含'utum',而我期望它是NULL。

此外,

print("utum" in vocab) 

返回真。

这是没有道理给我。我偷看了词汇表,并用“秋天”和“哥伦比亚”这几个词语发现了'utum'

但是,'utum'本身不是一个词,我期望nltk返回false。有一个更准确的语料库,我可以检查,会做整个字的比较?

而且,我做了一个简单的设置操作测试:

set1 = {"cutums" "acutum"} 
print("utum" in set1) 

预期该返回false。

我想我很困惑,为什么代码说“utum”出现在NLTK话语料库。

谢谢, Mahesh。