Удаление стоп-слов из набора файлов

#python

#python

Вопрос:

Я пытаюсь прочитать все файлы в каталоге, получить доступ к файлу с стоп-словами, просмотреть каждый файл, удалить стоп-слова из каждого файла, а затем сгенерировать копию всех файлов с удаленными стоп-словами. Я могу читать во всех файлах, а также печатать их в виде массива, но я застреваю, когда дело доходит до двух шагов: удаление стоп-слов и печать полученных файлов в новый набор файлов. Последние три строки кода являются примером для генерации только одного текстового файла, но мне нужен какой-то цикл для генерации их всех.

 import pathlib

stop_words = open("StopWordList.txt")
stop_words.read()

for path in pathlib.Path(r'C:UsersUsuarioDesktopHelloWorldemails').iterdir():
    if path.is_file():
        current_file = open(path, "r")
        lines = current_file.read()
        words = lines.split()

        for y in stop_words:
            if not y in stop_words:

                appendFile = open('filteredtext.txt', 'a')
                appendFile.write(" " y)
                appendFile.close()
 

Комментарии:

1. перейдите по этой ссылке geeksforgeeks.org/removing-stop-words-nltk-python я считаю, что это то, чего вы могли бы хотеть

2. вы получаете y от stop_words и позже проверяете, находится ли y он внутри stop_words ? В этом нет никакого смысла. Вы должны получить y из words

3. возможно, вам следует получить words , использовать его для создания нового списка без stopwords , а затем объединить все слова в одну строку, а затем сохранить эту строку в файл. Это может работать быстрее, чем писать каждое слово отдельно.

4. Кстати: что делать, если в конце слова есть какой-то символ — . , , , ! , ? . Вы должны удалить его, прежде чем проверять его с помощью stopworkds. И вы также должны сравнить строчные буквы. Возможно, вам следует использовать module nltk для этого.

5. вы должны использовать path для создания нового имени для результатов вместо 'filteredtext.txt'

Ответ №1:

Я не тестировал это (у меня нет файла со стоп-словами), но я бы сделал

 import pathlib
import sys


if len(sys.argv) > 1:
    folder = sys.argv[1] # get folder as parameter
else:
    folder = r'C:UsersUsuarioDesktopHelloWorldemails'


stop_words = open("StopWordList.txt").read().lower()  # to compare lowercase stopwords with lowercase words

for path in pathlib.Path(folder).iterdir():
    if path.is_file():

        # --- read all text at once ---

        input_file = open(path) #  it use `r` as default
        text = input_file.read()
        input_file.close()

        original_words = text.split()  # text -> words

        # --- remove stopwords ---

        filtered_words = []

        for word in original_words:
            temp_word = word.lower().rstrip('.,!?')
            if temp_word not in stop_words:   # check lowercase without `.,!?`
                filtered_words.appeend(word)  # keep original word

        # --- save all text at once ---

        output_path = path   '-filtered'  # create new filename

        text = " ".join(filtered_words)  # words -> text

        output_file = open('output_path', 'w')
        output_file.write(text)
        output_file.close()
 

Он не удаляет .,!? и не преобразует в нижний регистр.

В конце концов, вы могли бы разделить код на функции

 import pathlib
import sys

# --- functions ---

def read_words(path):

    input_file = open(path) #  it use `r` as default
    text = input_file.read()
    input_file.close()

    words = text.split()  # text -> words

    return words

def filter_words(words, stopwords):

    filtered_words = []

    for word in all_words:
        temp_word = word.lower().rstrip('.,!?')
        if temp_word not in stop_words:
            filtered_words.appeend(word)

    return filtered_words

def write_words(path, words):

    text = " ".join(words)  # words -> text

    output_file = open(path, 'w')
    output_file.write(text)
    output_file.close()

# --- main ---

if len(sys.argv) > 1:
    folder = sys.argv[1] # get folder as parameter
else:
    folder = r'C:UsersUsuarioDesktopHelloWorldemails'

stop_words = open("StopWordList.txt").read().lower()  # to compare lowercase stopwords with lowercase words

for path in pathlib.Path(folder).iterdir():
    if path.is_file():
        words = read_words(path)
        words = fiter_words(words, stopwords)
        write_words(path   '-fitered', words)
 

Комментарии:

1. вы можете получить стоп-слова из пакета nltk следующим образом из nltk.corpus импортируйте стоп-слова и получите стоп-слова на английском языке следующим образом stop_words = set(stopwords.words(‘english’))

2. @SachinRajput я знаю nltk (и, вероятно, у меня он даже установлен), но мне лень тестировать этот код 🙂

Ответ №2:

Следующий код, основанный на вашем коде, — моя помощь, я изменил имена некоторых переменных вашего исходного кода, чтобы они были более осмысленными, в дополнение к некоторым модификациям:

 import os
import pathlib

# preparing the StopWordList to be used with each file
stop_words = open("StopWordList.txt")
StopWordList_raw = stop_words.read()
stop_words.close()

StopWordList = StopWordList_raw.split()

# Pathes of source files and that for after-modifications
files_path = 'C:UsersUsuarioDesktopHelloWorldemails'
# another folder, your should create first to store files after modifications in
files_after_path = 'C:UsersUsuarioDesktopHelloWorldemails2'

for path in pathlib.Path(files_path).iterdir():
    if path.is_file():
        current_file = open(path, "r")
        # get the all contents of the file
        original_file_content = current_file.read()

        # get a copy for modifications if stop words exist
        file_content_after = original_file_content

        # remove stop words by replacing each of them with '' - if exist
        for w in StopWordList:
            file_content_after = file_content_after.replace(w, '')

        # if modifications done to the original content, save the file in the atrget path
        if original_file_content != file_content_after:
            file_name_after = os.path.join(files_after_path, path.name)
            print(file_name_after)
            TargetFile = open(file_name_after, 'w')
            TargetFile.write(file_content_after)
            TargetFile.close()