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

时间:2016-02-29 08:28:50

标签: python machine-learning nlp nltk

我正在研究一个问题,在这个问题中我列出了很多单词的出现频率。以下是我得到的一个示例:

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'这样的词来说是否会给我一个真实的

请帮忙。

谢谢, 马赫什。

2 个答案:

答案 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个单词的任何串联中。

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

另外,请注意语料库是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单词语料库中。

谢谢, 马赫什。