用于确定某事物是否为“"字”的启发式算法。还是随机数据?

时间:2018-04-02 13:40:12

标签: python search nlp nltk heuristics

我在python中编写了一个web爬虫,它下载了一个URL列表,从HTML中提取所有可见文本,对文本进行标记(使用nltk.tokenize),然后在每个文档中创建一个位置倒置的单词索引供我们使用搜索功能。

但是,现在,索引包含一堆无用的条目,如:

1)//roarmag.org/2015/08/water-conflict-turkey-middle-east/

2)———-

3)ykgnwym+ccybj9z1cgzqovrzu9cni0yf7yycim6ttmjqroz3wwuxiseulphetnu2

4)iazl+xcmwzc3da==

其中一些(如#1)是URL出现在文本中的位置。有些像#3一样,是PGP密钥的摘录,或者是文本中嵌入的其他随机数据。

我试图了解如何过滤掉这样无用的数据。但是,我并不想保留我在英语词典中找到的单词,还有像名字,地方,无意义的单词,比如" Jabberwocky"或" Rumpelstiltskin",首字母缩略词,如" TANSTAAFL",隐藏技术/科学术语等......

也就是说,我正在寻找一种方法来启发式地删除那些" jibberish"。 (1)超长"长" (2)填充了一串由随机字符串组成的标点符号(3),例如afhdkhfadhkjasdhfkldashfkjahsdkfhdsakfhsadhfasdhfadskhkf ...我明白没有办法以100%的准确率做到这一点,但如果我能删除75%的垃圾我和#39;快乐。

我是否可以使用任何技术来分离"单词"从像这样的垃圾数据?

1 个答案:

答案 0 :(得分:2)

过长的单词过滤是微不足道的。过滤掉网址也很容易。我不了解Python,但其他语言有可用于确定某些内容是相对URL还是绝对URL的库。或者您可以使用“带标点符号的字符串”过滤器来过滤掉包含斜杠的任何内容。

单词比较棘手,但你可以用n-gram language models做得很好。基本上,您构建或获取语言模型,并通过模型运行每个字符串以确定该字符串是特定语言中单词的可能性。例如,“Rumplestiltskin”作为英语单词的可能性要高于“xqjzipdg”。

有关经过培训的模型,请参阅https://github.com/ciprian-chelba/1-billion-word-language-modeling-benchmark,以确定字符串是否是某种语言的实际单词。

另见NLTK and language detection