2014-10-21 2 views
-1

Я хочу заменить слова, которые появляются один раз в предложении с '<unk>'. Как и для предложения: hello hello world my world, я хочу, чтобы результат был hello hello world <unk> world, как это сделать?Как заменить слова, которые появляются однажды в предложении в python

Прямо сейчас я делаю так:

wordlist1 = trainfiles.split(None) 
     wordlist2 = [] 
     for word1 in wordlist1: 
      lastchar = word1[-1:] 
      if lastchar in [",",".","!","?",";"]: 
       word2 = word1.rstrip(lastchar) 
      else: 
       word2 = word1 
      wordlist2.append(word2) 
     freq = {} 
     for word2 in wordlist2: 
      freq[word2] = freq.get(word2,0)+1 
     keylist = freq.keys() 
     keylist.sort() 

    for key2 in keylist: 
     if freq[key2] == 1: 
      print "%-10s %d" % ('<unk>', freq[key2]) 
     else: 
      print "%-10s %d" % (key2, freq[key2]) 

Который дает мне выход, как:

hello 2 
<unk> 1 
world 2 

Но, мне нужен выход, как:

hello hello world <unk> world 

Как сделать это?

+0

конкатенировать строку и «распечатать» ее один раз? –

ответ

2

Ключ, как @Cyber ​​указывает, что использовать collections.Counter. Эта версия сохраняет препинания и пробелы оригинальной строки.

import re 
from collections import Counter 
trainfiles = 'hello hello, world my world!' 

wordlist = re.findall(r'\b\w+\b', trainfiles) 
wordlist = Counter(wordlist) 
for word, count in wordlist.items(): 
    if count == 1: 
     trainfiles = re.sub(r'\b{}\b'.format(word), '<unk>', trainfiles) 

print trainfiles 
5

collections.Counter Используйте сосчитать частоту эти слова в предложении

from collections import Counter 
s = 'hello hello world my world' 
counts = Counter(s.split()) 

Затем используйте выражение генератор, чтобы заменить любое слово, которое имеет счетчик 1, и присоединиться результата пробел.

replaced = ' '.join(i if counts[i] > 1 else '<unk>' for i in s.split()) 

Результат

'hello hello world <unk> world' 
+0

Почему я могу получить недопустимый синтаксис для коллекций в инструкции import? –

+0

, вы должны, вероятно, удалить пунктуацию, чтобы получить точный счетчик «привет здравствуйте». Split(). Count («hello») = 1' –

+0

Похоже, что OP уже удалил пунктуацию к моменту, когда они попадают на счет логики, но я мог ошибаться. – CoryKramer