我有一个文件中所有单词的频率计数(我用来分析和索引数据:elasticsearch),单词的频率遵循zipf定律。我如何利用这些知识来改进对它的搜索?相反,我怎样才能用它来完成任何有益于我的事情?
答案 0 :(得分:0)
我认为这是一个非常有趣的问题,我很遗憾没有回答或评论这么长时间。 Zipfian分布是一种不仅在语言中出现,而且远远超出这种现象的现象。
Zipfian分布或Zipf定律是这种情况下词的秩频分布。但也许更重要的是,帕累托分布意味着大约20%的单词(原因)在文本的任何给定的身体或身体中占大约80%的单词出现(结果)。弹性研究背后的大脑Lucene以多种方式解释了这一点,并且经常超出了zipf法则。您的结果将包含zipfian分布,这很常见。
这里的问题之一是在大多数文本主体中,最常见的词实际上是最不具体的语境。通常是一篇文章或具有非常有限的背景。英语中最常见的三个词是:"",""和" to"。 Elasticsearch实际上附带了stop words列表,它将通过忽略文章来优化索引。
Elasticsearch停用词:
a,an,and,as,as,at,be,but,by,for,if,in,into,is,it,no, 那些,他们,然后,那些,他们,他们,
这个,to,was,will
实际上,出现频率最低的词语是最常见的情况。因此,在进行文本搜索时,您可能会寻找最不常用的单词。
物联网是弹性搜索,而lucene都是以这些东西为基础构建的,并且为此进行了很好的优化。用于缓存索引的简单LRU eviction policy实际上非常有效,因为80%的搜索可能会使用20%的实际索引,因为可预测的工作负载会导致缓存污染不频繁且影响较小。因此,如果您分配的缓存大小超过总索引大小的20%,那么您应该没问题。如果索引不在缓存中,它将读取磁盘(通常是mmap),您可以通过快速随机读取(如SSD)来优化性能。
这有一个有趣的article。您的数据集中的总字排名很可能与大多数其他数据集的字排名非常相似。因此,优化性能和相关性留给那些可能最不常发生但很可能最常搜索的词。这可能是您的应用程序所针对的人口统计/专业背景的行话。
然而,这些优化可能为时过早。就像我说的那样,lucene和elasticsearch都在努力提高搜索的效率和效率。就像我之前所说的,在这种情况下,一个简单的LRU缓存非常有效,并且LRU既常见(已经是ES的一部分)又相对简单。可能值得的情况通常是你有很多行话或特定语言或者多语言的情况。对于类似新闻网站的内容,您可能需要更广泛的解决方案,因为您涵盖了大量主题,包括许多不同的单词和主题。这些通常是您在配置弹性搜索时要考虑的事项,但是修改分析器可能很复杂并且可能很难有效,特别是如果您有大量具有不同术语的主题需要索引,可能会对提高搜索相关性产生最大影响。