【问题标题】:Basic local search engine - Python基本的本地搜索引擎 - Python
【发布时间】:2016-02-16 15:46:42
【问题描述】:

这是我大学的一项作业,我必须使用 Python 2.7.10 编写一个基本的搜索引擎。

我的搜索引擎需要查看我计算机上一个文件夹中的一组文档,打开它们,去掉一些标点符号,将所有内容设为小写,并为文档中的每个标记创建一个倒排索引。索引将存储为字典,其中键作为令牌,值作为包含令牌的文档列表。示例:在文档 1、文档 2 和文档 5 中找到标记“æble”。 然后用户应该能够只输入一个单词,然后程序应该获取包含该单词的文档列表。

我使用 os、codecs 和 sys 模块。

首先我想定义我的函数。我已经开始定义程序将用于打开文档并同时将其设为小写的函数。 路径将在程序后面由 raw_input 指定。

def open_doc(path):
    docfile = codecs.open(path, 'r', encoding='utf-8')
    doclist = docfile.read().lower().split()
    docfile.close()
    return doclist

然后,我有我的功能来标记我将应用于用户查询的单个单词。

def tokenize(word):
    tokenword = word.strip(',.-?!=()')
    return tokenword

现在,更加标记化。在这里,我尝试将我的标记化函数附加到包含不同文档的字典中。

def tokedict(dict):
    tokenizeddict = {}
    for key in dict:
        tokenizeddict[key] = []
        for item in dict[key]:
            tokenizeddict[key].append(tokenize(item))
    return tokenizeddict

现在,我有一个函数可以反转我的索引。值会变成键,键会变成值。

def invert_dict(d):
    inverse = dict()
    for key in d:
        val = d[key]
        if val not in inverse:
            inverse[val] = [key]
        else:
            inverse[val].append(key)
    return inverse

我认为这符合预期。

所以,这就是我的主程序必须调用的主要功能。 当用户打开程序时,系统会提示用户选择存储文档的文件夹的路径,以便定义名为“路径”的变量。

path = raw_input('please specify the path to the folder you would like to search in: ')

然后,程序将为将使用上述函数创建的索引创建一个字典。

一、空索引

index = dict()

然后该函数用所选路径中的文档填充索引。

for document in os.listdir(path):
    index[str(document)] = open_doc(path+document)

这基本上是我到现在为止的。我有点卡在程序上。 我有一个搜索功能,但出于某种原因,即使它也无法正常工作。

如下:

def User_search():
    searchword = raw_input('Please type 1 word to search for: ')
    searchword = searchword.lower()
    searchword = searchword.strip(',.!?()=')
    return searchword

所以,我现在的最后一个问题是: 如何将这些部分连接起来并最终得到一个可以执行以下功能的程序:

通过用户给定的路径扫描文件夹 将文件夹中文档的内容标记化并小写 - 做一个倒排索引 - 让用户首先选择一个文件夹的路径;然后让用户输入搜索词 - 以正确的顺序调用函数 - 给出一个包含(某种)包含搜索词的文档列表的结果。

我想,最终的功能是这样的:

for key in inverse:
    if searchword in key
        print 'Your searchword' + searchword + 'has been found in the following documents' + value
    if searchword not in key
        print 'no documents have been found containing your searchword'

但这只是一个想法。

我期待收到任何形式的帮助。我花了一个多小时才输入这个问题,所以我希望它对你来说很容易理解。如果不是,我会尽量澄清。

最诚挚的问候

【问题讨论】:

  • searchword.lower。您忘记了实际调用该方法。还有其他几个基本的拼写错误(缺少括号等)。另一个要点,这里有很多额外的信息。除了不起作用的代码、对它应该做什么的快速描述以及错误之外,我们真的不需要更多。您可能需要重读minimal reproducible example

标签: python dictionary search-engine tokenize


【解决方案1】:

您的语法错误:

tokenizeddict[key].append(tokenize(item)

是因为您在末尾缺少括号。应该是:

tokenizeddict[key].append(tokenize(item))

“dict”也是python类型,不是一个合适的变量名——我肯定会重命名它。

因为这个,你得到了builtin_function_or_method has no attribute 'strip'

searchword = searchword.lower

您只是在访问该方法,而不是实际调用它。你想做的事:

searchword = searchword.lower()

我希望这会有所帮助。仅供参考,将来将其分解为有关特定错误的个别问题会更合适。如果您想在解决这些错误后整体讨论您的程序,请查看 CodeReview。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2010-12-16
    • 2017-07-02
    • 1970-01-01
    • 2016-06-09
    相关资源
    最近更新 更多