我正在研究一个问题,在这个问题中我列出了很多单词的出现频率。以下是我得到的一个示例:
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
正如你所看到的,像''cordially'这样的单词是真正的英语单词,而像'infonewsletter'这样的单词本身并不是真正的英语单词,但是我们可以看到它们实际上是英语并且意味着什么。然而,像'OnKxnXecCINJ'这样的词并不意味着什么(实际上它们是来自另一个字符集的词,但我在练习中忽略它们并坚持使用英语) - 我可以把它们丢弃为垃圾
Python中检测和消除上述字典中的垃圾词的最佳方法是什么?
我尝试使用nltk.corpus.word.words()检查每个单词,但由于我的数据集非常庞大,因此它会破坏我的性能。而且,我不确定这对于像'infonewsletter'这样的词来说是否会给我一个真实的
请帮忙。
谢谢, 马赫什。
答案 0 :(得分:5)
如果单词来自 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
左右。
另外,请注意语料库是set
用于快速in
操作;只有在算法告诉它很可能是英语后,并且在set
中找不到该词,认为它与infonewsletter
相似 - 是几个词的串联;将它递归地分成更小的块,并看到它的每个部分都在语料库中找到。
答案 1 :(得分:0)
谢谢。我正在尝试这种方法。但是,我有一个问题。我有一句话' vdgutumvjaxbpz'。我知道这是垃圾。我写了一些代码来获得这个单词的所有克数,4克及更高。这就是结果:
[' vdgu',' dgut',' gutu',' utum',' tumv',& #39; umvj',' mvja',' vjax',' jaxb',' axbp',' xbpz&# 39;,' vdgut',' dgutu',' gutum',' utumv',' tumvj',&# 39; umvja',' mvjax',' vjaxb',' jaxbp',' axbpz',' vdgutu&#39 ;,' 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& #39;,' umvjaxbpz',' vdgutumvja',' dgutumvjax',' gutumvjaxb',&#39 ; utumvjaxbp',' tumvjaxbpz',' vdgutumvjax',' dgutumvjaxb',' gutumvjaxbp',' utumvjaxbpz' ,' vdgutumvjaxb',' dgutumvjaxbp',' gutumvjaxbpz',' vdgutumvjaxbp',' dgutumvjaxbpz',' vdgutumvjaxbpz']
现在,我将每个克的结果与nltk.corpus.words.words()进行比较,找到了两组的交集。
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)
返回true。
这对我没有意义。我偷看了词汇,发现了' utum'用几句话来说就像秋天和metascutum
然而,' utum'这不是一个单词,我希望nltk返回false。是否有一个更准确的语料库,我可以检查,这将进行全字比较?
另外,我做了一个简单的设置操作测试:
set1 = {"cutums" "acutum"}
print("utum" in set1)
按预期返回False。
我想我很困惑为什么代码会说' utum'存在于nltk单词语料库中。
谢谢, 马赫什。