Удаление всех стоп-слов, определенных в файле, из текста в другом файле (Python) - PullRequest
0 голосов
/ 24 октября 2019

У меня есть два текстовых файла:

  1. Stopwords.txt -> содержит стоп-слова по одному в строке
  2. text.txt -> файл большого документа

Я пытаюсь удалить все вхождения стоп-слов (любое слово в файле stopwords.txt) из файла text.txt без использования NLTK (школьное задание).

Как бы я поступил так? Это мой код до сих пор.

import re

with open('text.txt', 'r') as f, open('stopwords.txt','r') as st:
    f_content = f.read()
    #splitting text.txt by non alphanumeric characters
    processed = re.split('[^a-zA-Z]', f_content)

    st_content = st.read()
    #splitting stopwords.txt by new line
    st_list = re.split('\n', st_content)
    #print(st_list) to check it was working

    #what I'm trying to do is: traverse through the text. If stopword appears, 
    #remove it. otherwise keep it. 
    for word in st_list:
        f_content = f_content.replace(word, "")
        print(f_content) 

но когда я запускаю код, сначала выводится что-то навсегда, а когда это происходит, он просто выводит весь текстовый файл. (Я новичок в Python, поэтому дайте мне знать, если я делаю что-то в корне неправильно!)

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

Я знаю, что Python действительно хорош для подобных вещей (и многих других), но если у вас действительно большой text.txt. Я бы попробовал старую, некрасивую и мощную командную строку 'sed'.

Попробуйте что-то вроде:

sed -f stopwords.sed text.txt> output_file.txt

Для файла stopwords.sed, каждое стоп-слово должно быть в отдельной строке и иметь следующий формат:

s|\<xxxxx\>||g

Где «xxxxx» - это само слово-стоп.

s|\<the\>||g

Строка выше удалит все вхождения '(' без одинарных кавычек)

Стоит попробовать.

0 голосов
/ 24 октября 2019

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

import re
from stemming.porter2 import stem as PT


with open('text.txt', 'r') as f, open('stopwords.txt','r') as st:

    f_content = f.read()
    processed = re.split('[^a-zA-Z]', f_content)
    processed = [x.lower() for x in processed]
    processed = [PT(x) for x in processed]
    #print(processed)

    st_content = st.read()
    st_list = set(st_content.split())

    clean_text = [x for x in processed if x not in st_list]
    print clean_text
0 голосов
/ 24 октября 2019

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

from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
ps = PorterStemmer()

## Remove stop words
stops = set(stopwords.words("english"))
text = [ps.stem(w) for w in text if not w in stops and len(w) >= 3]
text = list(set(text)) #remove duplicates
text = " ".join(text)

Для вашего особого случая я бы сделал что-то вроде:

stops = list_of_words_from_file

Дайте мне знать, если я ответил на ваш вопрос, я не уверен, что проблема заключается в чтении из файла илиthe stemming.

Редактировать: Чтобы удалить все стоп-слова, определенные в файле, из текста в другом файле, мы можем использовать str.replace ()

for word in st_list:
    f_content=f_content.replace(word)
...