用于确定某物是 "word" 还是随机数据的启发式方法?

Heuristics for determining whether something is a "word" or random data?

我正在 python 中编写网络爬虫,它下载 URLS 列表,从 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" 等首字母缩略词等内容,模糊 technical/scientific 术语等...

也就是说,我正在寻找一种方法来试探性地去除 "jibberish" 的字符串。 (1) 极其 "long" (2) 充满了一堆标点符号 (3) 由随机字符串组成,例如 afhdkhfadhkjasdhfkldashfkjahsdkfhdsakfhsadhfasdhfadskhkf ... 我明白没有办法做到 100% 准确,但如果我甚至可以删除 75% 的垃圾我会很高兴。

有没有什么技术可以用来将 "words" 从这样的垃圾数据中分离出来?

过长的词很难过滤。过滤掉 URL 也很容易。我不知道 Python,但其他语言有一些库,您可以使用它来确定某事是相对的还是绝对的 URL。或者您可以只使用 "strings with punctuation" 过滤器过滤掉任何包含斜杠的内容。

文字比较棘手,但您可以用 n-gram language models 写得很好。基本上,您构建或获取一个语言模型,然后 运行 每个字符串通过该模型来确定该字符串是特定语言中的单词的可能性。例如,"Rumplestiltskin" 比 "xqjzipdg".

更可能是英语单词

请参阅 https://github.com/ciprian-chelba/1-billion-word-language-modeling-benchmark 以了解经过训练的模型,它可能对您确定字符串是否是某种语言中的实际单词很有用。

另见 NLTK and language detection