基本的本地搜索引擎 - Python
Basic local search engine - Python
这是我大学的一项作业,我必须使用 Python 2.7.10.
编写一个基本的搜索引擎
我的搜索引擎需要查看我计算机上某个文件夹中的一组文档,打开它们,去除一些标点符号,将所有内容设为小写,并为文档中的每个标记制作一个倒排索引。索引将存储为字典,其中键作为标记,值作为包含标记的文档列表。示例:令牌“æble”在文档 1、文档 2 和文档 5 中找到。
然后用户应该能够只输入一个单词,然后程序应该获得包含该单词的文档列表。
我使用 os、编解码器和 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
我认为这符合预期。
所以,这是我的主程序必须调用的主要功能。
当用户打开程序时,系统会提示用户选择 ose 存储文档的文件夹路径,以便定义名为 'path'.
的变量
path = raw_input('please specify the path to the folder you would like to search in: ')
然后,程序将为将使用上述函数创建的索引创建一个字典。
一是空索引
index = dict()
然后函数用 chosen 路径中的文档填充索引。
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
所以,我现在的最后一个问题是:
我如何连接这些部分并最终得到一个将执行以下功能的程序:
按用户给定的路径扫描文件夹
将文件夹中文档的内容标记化并小写 -
做一个倒排索引——
让用户首先选择ose 一个文件夹的路径;然后让用户输入搜索词 -
以正确的顺序调用函数 -
给出包含包含搜索词的文档列表(某种)的结果。
我想最终的函数应该是这样的:
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'
但这只是一个想法。
我期待收到任何形式的帮助。我花了一个多小时才输入这个问题,所以我希望它对你来说很容易理解。如果没有,我会尽力澄清。
最诚挚的问候
您的语法错误:
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。
这是我大学的一项作业,我必须使用 Python 2.7.10.
编写一个基本的搜索引擎我的搜索引擎需要查看我计算机上某个文件夹中的一组文档,打开它们,去除一些标点符号,将所有内容设为小写,并为文档中的每个标记制作一个倒排索引。索引将存储为字典,其中键作为标记,值作为包含标记的文档列表。示例:令牌“æble”在文档 1、文档 2 和文档 5 中找到。 然后用户应该能够只输入一个单词,然后程序应该获得包含该单词的文档列表。
我使用 os、编解码器和 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
我认为这符合预期。
所以,这是我的主程序必须调用的主要功能。 当用户打开程序时,系统会提示用户选择 ose 存储文档的文件夹路径,以便定义名为 'path'.
的变量path = raw_input('please specify the path to the folder you would like to search in: ')
然后,程序将为将使用上述函数创建的索引创建一个字典。
一是空索引
index = dict()
然后函数用 chosen 路径中的文档填充索引。
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
所以,我现在的最后一个问题是: 我如何连接这些部分并最终得到一个将执行以下功能的程序:
按用户给定的路径扫描文件夹 将文件夹中文档的内容标记化并小写 - 做一个倒排索引—— 让用户首先选择ose 一个文件夹的路径;然后让用户输入搜索词 - 以正确的顺序调用函数 - 给出包含包含搜索词的文档列表(某种)的结果。
我想最终的函数应该是这样的:
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'
但这只是一个想法。
我期待收到任何形式的帮助。我花了一个多小时才输入这个问题,所以我希望它对你来说很容易理解。如果没有,我会尽力澄清。
最诚挚的问候
您的语法错误:
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。