Это должно делать то, что вы ищете, оно использует set
& пересечение, чтобы избежать зацикливания.Шаги -
- получить отрицательные слова в строке
- проверить местоположение каждого слова
- , если после этого места записано слово «ноутбук», запишите его
Обратите внимание, что это будет идентифицировать только первое вхождение отрицательного слова в строке, поэтому «ужасный ужасный ноутбук» не будет совпадением.
from collections import defaultdict
def run(path):
negWords=defaultdict(int) # A defaultdict(int) will start at 0, can just add.
#load the negative lexicon
negLex=loadLexicon('negative-words.txt')
# ?? Is the above a list or a set, if it's a list convert to set
negLex = set(negLex)
fin=open(path)
for line in fin: #for every line in the file (1 review per line)
line=line.lower().strip().split(' ')
# Can just pass a list to set to make a set of it's items.
review_set = set(line)
# Compare the review set against the neglex set. We want words that are in
# *both* sets, so we can use intersection.
neg_words_used = review_set & negLex
# Is the bad word followed by the word laptop?
for word in neg_words_used:
# Find the word in the line list
ix = line.index(word)
if ix > len(line) - 2:
# Can't have laptop after it, it's the last word.
continue
# The word after this index in the line is laptop.
if line[ix+1] == 'laptop':
negWords[word] += 1
fin.close()
return negWords
Если выЗаинтересованы только в словах, предшествующих слову «ноутбук», гораздо более разумным подходом было бы найти слово «ноутбук», а затем проверить слово перед этим, чтобы увидеть, является ли оно отрицательным словом.В следующем примере это делается.
- найти ноутбук в текущей строке
- , если ноутбук не в строке или это первое слово, пропустить строку
- получите слово перед ноутбуком, проверьте на наличие отрицательных слов
- , если у вас есть совпадение, добавьте его к нашему результату
Это позволяет избежать поиска слов, не относящихся к ноутбукам.
from collections import defaultdict
def run(path):
negWords=defaultdict(int) # A defaultdict(int) will start at 0, can just add.
#load the negative lexicon
negLex=loadLexicon('negative-words.txt')
# ?? Is the above a list or a set, if it's a list convert to set
negLex = set(negLex)
fin=open(path)
for line in fin: #for every line in the file (1 review per line)
line=line.lower().strip().split(' ')
try:
ix = line.index('laptop')
except ValueError:
# If we dont' find laptop, continue to next line.
continue
if ix == 0:
# Laptop is the first word of the line, can't check prior word.
continue
previous_word = line[ix-1]
if previous_word in negLex:
# Negative word before the current one.
negWords[previous_word] += 1
fin.close()
return negWords