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。
如果字是从内部完全不同的脚本的Unicode像CJK
字符或希腊语,俄语,泰语,你可以使用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个单词的串联。
您可以通过将单词拆分为字符三联体来从语料库中自行构建一个,也可以使用任何现有的库,如langdetect
或langid
左右。
此外,请参见快速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。
安置自己的代码,以便我们可以帮助你很好。 – NiviD