Python - сопоставлять слова в текстовом файле со словарем и манипулировать значением - PullRequest
1 голос
/ 20 декабря 2010

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

«Собаки - отличные питомцы, а хомяки - плохие питомцы. Вот почему я хочу собаку»

Мой словарь:

Dict = {'dogs': 5, 'hampsters': -2}

Тогда я бы хотел посчитать 8 ((2x5) -2 = 8). Я могу найти случаи в словаре с

    for key in Dict: 
    m = re.findall(key, READ , re.IGNORECASE)

но мне не удалось получить доступ к значению ключа полезным способом.

Любая помощь очень ценится.

Спасибо, Скотт

Ответы [ 4 ]

3 голосов
/ 20 декабря 2010

РЕДАКТИРОВАТЬ: Стив V вдохновил следующее, что довольно приятнее:

sentence = "...".split()
score = sum(sentence.count(word) * score for word, score in scores.items())

Обязательный однострочный:

>>> s = "Dogs are great pets and hamsters are bad pets. That is why I want a dog."
>>> scores = {'dogs': 5, 'hamsters': -2}
>>> import collections
>>> sum(scores.get(word.lower(), 0) * freq for word, freq in collections.Counter(s.split()).items())
3

и разделение:

>>> sum = 0
>>> counts = collections.Counter(s.split())
>>> for word, freq in counts.items():
...     sum += scores.get(word.lower(), 0) * freq
...
>>> sum
3

Примечательные особенности:

  • Оценка не 8 (как вы утверждали выше), а 3, потому что слово dogs появляется только один раз в строке, которую вы дали,Если вы хотите посчитать слово dog дважды, вам понадобится (намного) более сложный алгоритм, возможно, взаимодействующий с библиотекой множественного числа для обработки таких случаев, как child -> children и man -> men.Это будет непросто или не обязательно правильно.

  • Я включил .lower(), чтобы игнорировать использование заглавных букв в строке, которую вы дали.Если вы этого не хотите, просто удалите вызов.

  • Вы ошиблись "хомяком": стр.

1 голос
/ 20 декабря 2010

Используйте ответ katrielalex, если это возможно, он чище, чем мой. Если у вас нет Python 2.7 (как у меня), это может работать для вас:

sentence = "Dogs are great pets and hamsters are bad pets. That is why I want a dog"

scores = {'dog' : 5, 'hamster' : -2} 

occurrences = {}

for key in scores: 
  m = re.findall(key, sentence , re.IGNORECASE)
  occurrences[key] = len(m)

totalScore = 0

for word in occurrences:
  totalScore += scores.get(word.lower(), 0) * occurrences[word]

print totalScore

Я сделал «псы» -> «псы» в вашем словаре оценок, исходя из предположения, что это опечатка. Если вы измените его обратно, ваш результат будет 3 без плюрализации.

0 голосов
/ 25 июня 2012

Еще один вариант ответа katrielalex для тех, кто застрял в Python 2.6,

поместите этот фрагмент в файл (например, counter.py): http://code.activestate.com/recipes/576611/

, тогда вы можете использовать следующеекод:

from counter import Counter

counts = Counter(text.split())
for word, freq in counts.items():
    sum += scores.get(word.lower(), 0) * freq 
...

Практически то же самое, за исключением того, что он работает со старыми версиями Python.

0 голосов
/ 20 декабря 2010

это должно сработать:

mtext = "Собаки - отличные питомцы, а хомяки - плохие питомцы. Вот почему я хочу собаку" для ключа в Dict: p = re.compile ('dog', re.IGNORECASE) NuOfDogs = len (p.findall (mtext)) # возвращает количество повторений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...