如何找到基本的,未反思的单词进行搜索?

Jon*_*Jon 2 perl search nlp stemming lemmatization

我在尝试编写一个搜索引擎时遇到了麻烦,该搜索引擎将一个单词的所有变形视为相同的基本单词.

  1. 所以对于动词这些都是相同的词根,:
    • 号码/人(例如 am; is; are)
    • 紧张/情绪,如过去或未来时态(例如 是;是;将会)
    • 过去分词(例如 曾经过 ; 曾经)
    • 现在分词和动名词(例如 正在 ; 没有被滑稽; 早期小于重要正确的)
    • 虚拟式( 可能,关键的东西完成,我希望它)⁠⁠⁠

  2. 然后对于名词,单数形式和复数形式都应该算作相同的基本单词[ ᴇᴅɪᴛᴏʀɴᴏᴛᴇɴᴏᴛᴇ:这经常被称为单词的引用形式.]

例如,使用" 启用 ",我不希望将" 启用 "和" 启用 "打印为单独的条目.所有这三个都应该算作相同的基本单词,即动词启用.

我可以使用哈希来阻止打印重复项:

unless ($seenmatches{ $headmatches[$l] }++)
Run Code Online (Sandbox Code Playgroud)
  1. 有人可以解释一下吗?在下面的评论中解释.

  2. 这并不能阻止复数/过去继续下去.有没有办法做到这一点,或者一些完全不同的方法,也许一个涉及正则表达式和/或替换,然后是一个unsub后来?

我不能用替换修改单词,因为那时打印不会正确打印出来.虽然我还没有进入舞台,但最终我还想包括不规则的过去时期[ ᴇᴅɪᴛᴏʀɴᴏᴛᴇɴᴏᴛᴇ:还有不规则名词]以及

我不知道你还有什么需要回答我的问题,所以请让我知道任何我无意中遗漏的内容,并且我会填写任何遗漏的内容以帮助更清楚.

Stu*_*att 5

典型搜索引擎的工作方式如下:

  • 输入字符串被标记化,在字边界处被切断 - 字符偏移开始/结束与每个标记相关联
  • 然后阻止每个令牌 - 我使用Lingua::Stem(或更好Lingua::Stem::Snowball),这是Porter词干分析器的略微更新版本
  • 在标记之前,每个标记及其原始字符偏移开始/结束将被保留并编入索引,通常与原始文本的副本一起.这基本上是一个表格,它将术语文本与其原始文档相关联(通常作为标识符)

现在,当一个查询到达时,它也被标记化并且每个标记都被阻止,但这次我们并不关心位置.我们查找每个令牌与我们索引的那些令牌,以找到帖子(匹配文档标识符).我们现在可以检索存储的开始/结束偏移以确定术语在原始文本中的位置.

因此,您确实丢失了索引的后缀(这是用于查找匹配文档的内容),但您保留了原始文本和这些文档的偏移量,因此您可以根据需要进行查询突出显示和漂亮的显示内容.

Stemming绝对是这项工作的正确工具.主要技巧是确保以相同的方式处理查询和文档.您可以修改原始文档,但实际上,您希望将其转换为类似书籍索引的内容,而不是将其转换为使用正则表达式的字符串 - 如果您确实在使用搜索引擎,那就是.KinoSearch如果您愿意,请查看CPAN上的优秀模块,或查看最初派生自的Apache Lucene项目.

  • @tchrist不,没有触及拉丁语或希腊语.我的工作不是在一个使用很多东西的领域.Snowball页面指出了拉丁语的一些工作 - http://snowball.tartarus.org/otherapps/schinke/intro.html,但它似乎没有进入任何发行版.对于希腊语,有一些参考一些大师的工作 - http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.99.623&rep=rep1&type=pdf - 甚至是JavaScript实现,但是你"对了,对这些的支持似乎普遍很弱.它们非常有用.我会问一些信息检索人员 (2认同)