我是Python的新手。
在这里,我试图浏览文件helpme.txt
,并删除stopwords1.txt
文件中的停用词。我的任务是仅使用1个参数。
我想出了以下几点,但我不断遇到错误:ValueError: list.remove(x): x not in list
。
任何善良的灵魂请帮助我。
thestop = open("stopwords1.txt", "r").readlines()
def remove_stop(stopwords):
new = []
new.append(open("helpme.txt","r").readlines())
stop = []
stop.append(stopwords)
for word in stop[:]:
new.remove(word)
print(new)
remove_stop(thestop)
答案 0 :(得分:0)
您可以在代码中进行很多改进...
def remove_stop(stopwords):
stopwords = set(stopwords) # It is faster to look up in a set!
new = []
正确打开文件并将其用作迭代器:
with open("helpme.txt") as infile:
for line in infile:
对于文件中的每一行,将该行分解为单词。检查单词是否不是停用词,并将幸存者合并到另一行。将行添加到已处理行的列表中。请注意,如果您有任何单词后跟标点符号,则将不会对其进行处理。使用NLTK来处理标点符号。
line = ' '.join([word for word in line.split()
if word not in stopwords])
new.append(line)
后五行可以写成 one-liner ,但是您不必走太远。不要忘记返回干净行列表!
return new
答案 1 :(得分:0)
返回一个列表。您正在尝试删除“新”中不存在的项目。所以它抛出错误。以此替换您的for循环
public static DocumentFile getDocumentFileParent(DocumentFile file) {
String filePath = file.getUri().getPath();
int index = filePath.lastIndexOf("/");
String parentPath = filePath.substring(0, index);
return DocumentFile.fromFile(new File(parentPath));
}
答案 2 :(得分:0)
尝试在stop
函数中打印remove_stop
变量,它看起来应该像这样[['stop word 1\n', 'stop word 2\n'....]]
。 (readlines
不会删除回车符)
这样,您的for循环将只有一个元素是停用词列表,而不是它们自己的停用词(与new
相同)。
可以这样解决,删除new
和stop
变量并替换它们。
stop = stopwords
new = open("helpme.txt","r").read().split('\n')
此外,您需要将thestop
更改为open("stopwords1.txt", "r").read().split('\n')
才能删除任何回车符,或者您可以在使用readlines
读取文件后将其删除。
最后,您需要有一个嵌套循环,因为您想从每一行中删除停用词,这样循环就将是这样。
for i in range(0, len(new)):
for j in range(0, len(stop)):
new[i] = new[i].replace(stop[j], '')
答案 3 :(得分:0)
辛苦。当您陷入困境时,这是练习基本调试和设计原则的好时机。
降低复杂性:一小段地处理代码,并确保每个组件在增加复杂性之前都可以正常工作。删除停用词和读取输入列表是完全不同的任务,并且可以按离散的块进行分解和调试。
在输入方面,文件是否按计划读取?而不是单词列表,您得到的是嵌套在列表中的字符串列表,其中包含文件内容,这似乎是意料之外的。 print
列出new
会显示[["stack overflow is awesome, don't you think?\n"]]
。删除.append
并在new
上直接赋值将确保您只处理一维字符串列表。
这时,字符串需要分解为单词。根据您对单词的定义,它可以是complex pattern matching task。现在,我建议保持简洁,并使用split()
来分隔空格,但要知道您可能会有悬挂的逗号,句点和引号,它们会影响您的输出。
设置完输入例程后,remove_stop
函数内部的事情应该更加清楚,该函数先前已中断,因为在尝试从列表中除列表以外的任何其他字符串中删除字符串时,它崩溃了。我更喜欢此功能的一种方法是使用list comprehension进行简洁但易读的语法,使用set进行快速,几乎瞬时的查找。相比之下,remove
是一种缓慢的方法,它一次浏览一次输入列表中的每个元素,以找到要在每次迭代中删除的项目。
将所有内容放在一起,这是一种方法:
def remove_stop(text, stopwords):
disallowed = set(stopwords)
return [word for word in text if word not in disallowed]
text = open("helpme.txt","r").read().split()
stopwords = open("stopwords1.txt","r").read().split()
print(remove_stop(text, stopwords))
给出示例文本:
helpme.txt
:
stack overflow is awesome, don't you think?
和stopwords1.txt
:
stack
overflow
以下是输出:
['is', 'awesome,', "don't", 'you', 'think?']
答案 4 :(得分:0)
这应该有效:
import re
def remove_stop(stopwords):
with open("helpme.txt", "r") as text_file:
words = text_file.read().split()
with open("helpme_out.txt", "w+") as filtered_text_file:
filtered_words = []
for word in words:
if re.sub('[^A-Za-z0-9]+', '', word) not in stopwords:
filtered_words.append(word)
filtered_text_file.write((" ").join(filtered_words))
if __name__ == "__main__":
with open("stopwords1.txt", "r") as stopwords_file:
remove_stop(
list(map(lambda x: x.strip("\n").lower(), stopwords_file.readlines())))
我知道这很复杂,目前对您不是很有帮助,但是您可以使用此处其他人建议的有关调试和设计的技巧来自己获得类似的答案,并使用上面的代码作为参考。 / p>