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

use*_*648 2 python nlp machine-learning 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
Run Code Online (Sandbox Code Playgroud)

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

Python中检测和消除上述字典中的垃圾词的最佳方法是什么?

我尝试使用nltk.corpus.word.words()检查每个单词,但由于我的数据集非常庞大,因此它会影响我的性能.而且,我不确定这是否会给我一个像'infonewsletter'这样的词的真实

请帮忙.

谢谢,马赫什.

Ant*_*ala 5

如果单词来自Unicode中完全不同的脚本,如字符或希腊语,西里尔语,泰语,您可以使用它来查看它们是否是开头的字母(类别以)开头:CJKunicodedata.categoryL

>>> 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]
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它unicodedata.name来看到它们是拉丁字母:

>>> 'LATIN' in unicodedata.name('a')
True
>>> 'LATIN' in unicodedata.false('?')
False
Run Code Online (Sandbox Code Playgroud)

据推测,如果它中包含非拉丁字母,则不是英语单词.


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

您可以自己从语料库通过拆分的话建立一个成字符卦,或者你可以使用任何现有的库像langdetectlangid左右.

另外,看到语料库是一个set快速in操作; 只有在算法告诉它很可能是英语后,并且在该单词中找不到该单词set,认为它与infonewsletter- 几个单词的串联相似; 将它递归地分成更小的块,并看到它的每个部分都在语料库中找到.