Проблема при замене слова / фразы из текстового файла с использованием набора в Python? - PullRequest
0 голосов
/ 21 июня 2019

Предположим, у меня есть список (new_list) с 3000 предложениями, где каждое предложение разделено запятой (,).

Пример (часть):

new_list = ['air purity controller, to detect pollution and letting cold air in', 'air quality in my home by air conditioning', 'air conditioner depending on home', 'household alarm clock for time']

Я хочу заменить определенные слова (одно слово или фразу) из new_list, добавив некоторые специальные символы (в начале и в конце),Я делаю это с помощью набора.

Пример набора:

dict = {'air conditioner', 'air', 'air quality', 'house', 'air conditioning', 'alarm clock'}

Размер набора (дикт) - 317. Я хочу отсканировать каждое слово изnew_list и заменить при совпадении с набором, добавив специальные символы в начальную и конечную позиции.Кроме того, если найдено совпадение и полученное слово является фразой из набора, то дополнительно добавляется специальный символ (_) между ними и добавляется специальный символ в начальной и конечной точках.

У меня естьпытался, но не удалось.Пожалуйста, предложите, где я иду не так (я так не думаю, я не прав).new_list и dict показаны выше.

import re, csv, nltk
from nltk.corpus import stopwords
from nltk import regexp_tokenize

with open("raw_data.txt", 'r', encoding = 'utf-8') as f1:
   reader = csv.reader(f1, skipinitialspace=True)
   new_list = next(reader)
   with open('updatd_file.txt', 'w', encoding='utf-8') as f2:
      dic = {'air conditioner', 'air quality', 'air conditioning', 'air', 'house', 'alarm clock'}
      dic = {i : i.replace(' ', '_') for i in dic} 
      pattern = re.compile(r"\b("+"|".join(dic)+r")\b")
      modify_reqs = [pattern.sub(lambda x: "_{}_".format(dic[x.group()]), i) for i in new_list]
      sw = (stopwords.words('english'))
      unfiltered_tokens = [[word for word in regexp_tokenize(word, pattern=r"\s|[\d]|[^\wa-z+]", gaps=True) if word not in sw] for word in modify_reqs]
      f2.write(str(unfiltered_tokens))

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

Иногда я могу найти фразу в правильном порядке (как и ожидалось), то есть '_air_conditioning_', но в следующий раз, когда я выполню этот фрагмент, я найду то же слово, что и '_air_', 'conditioning' (отделено).То же самое произошло и с другими фразами, такими как air quality, air conditioning и т. Д. Проблема связана с фразами, а не с одним словом.Обратите внимание, что в наборе (dict) у меня 317 слов и new_list, содержащих почти 3000 предложений.Не возможно показать все здесь.Как это возможно?Я пытаюсь это с 7-8 дней, это расстраивает сейчас.

1 Ответ

0 голосов
/ 21 июня 2019

Комментарий @Toto действительно помог мне решить проблему.

Я отсортировал использованные set в порядке убывания длины слов по ключевому слову sorted.

dic = sorted(dic, key=len, reverse=True) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...