2014-02-20 6 views
2

Допустим, у меня есть следующая строка:Частота слов в строке без пробелов и специальных символов?

"hello&^uevfehello!`.<hellohow*howdhAreyou" 

Как бы я идти о подсчете частоты английских слов, которые подстроки это? В этом случае я хотел бы результат, такие как:

{'hello': 3, 'how': 2, 'are': 1, 'you': 1} 

Я искал предыдущий вопрос, были похожи на этот, но я не мог найти ничего, что работает. Близкое решение, казалось, использовало регулярные выражения, но это тоже не сработало. Возможно, потому, что я неправильно это реализовал, так как я не знаком с тем, как это работает.

How to find the count of a word in a string? это последний ответ

from collections import * 
import re 

Counter(re.findall(r"[\w']+", text.lower())) 

Я также попытался создать очень плохую функцию, которая перебирает каждое возможное расположение последовательных букв в строке (до макс 8 букв или около того). Проблема с выполнением что

1) это путь дольше, чем это должно быть и

2) он добавляет дополнительные слова. ex: если «hello» был в строке, «ад» также был бы найден.

Я не очень хорошо знаком с регулярным выражением, что, вероятно, является правильным способом для этого.

+0

Чтобы подсчитать частоту английских слов, этого недостаточно. Вам нужно будет использовать что-то вроде [ntlk] (http://www.ntlk.org), и даже тогда это будет сложно, потому что у вас нет разделителей для слов. – msvalkon

+0

У вас есть функция или словарь для определения английских слов? –

+0

У меня был список английских слов, в которых я сравнивал части строки, но это не помогло. – Howcan

ответ

2
d, w = "hello&^uevfehello!`.<hellohow*howdhAreyou", ["hello","how","are","you"] 
import re, collections 
pattern = re.compile("|".join(w), flags = re.IGNORECASE) 
print collections.Counter(pattern.findall(d)) 

Выход

Counter({'hello': 3, 'how': 2, 'you': 1, 'Are': 1}) 
+0

Это O (len (d)) правильно? –

+0

@JayanthKoushik RegExs внутренне использует государственные машины, я считаю. Поэтому я не очень уверен в сложности.:( – thefourtheye

+0

Вы используете список известных слов для сравнения (w), поэтому технически мне придется использовать список английских слов? – Howcan

0
from collections import defaultdict 

s = 'hello&^uevfehello!`.<hellohow*howdhAreyou' 
word_counts = defaultdict(lambda: 0) 

i = 0 
while i < len(s): 
    j = len(s) 
    while j > i: 
     if is_english_word(s[i:j]): 
      word_counts[s[i:j]] += 1 
      break 
     j -= 1 

    if j == i: 
     i += 1 
    else: 
     i = j 

print word_counts 
+0

Это хорошо работает, но только для очень коротких строк. – Howcan

0

Вы должны извлечь все слова из строки, то для каждого слова вы должны найти подстроки, а затем проверьте, есть ли подстроки английское слово , Я использовал английский словарь из ответа в How to check if a word is an English word with Python?

В результате есть некоторые ложные срабатывания, поэтому вы можете использовать лучший словарь или использовать собственный метод для проверки желаемых слов.

import re 
import enchant 
from collections import defaultdict 

# Get all substrings in given string. 
def get_substrings(string): 
    for i in range(0, len(string)): 
     for j in range(i, len(string)): 
      yield s[i:j+1] 

text = "hello&^uevfehello!`.<hellohow*howdhAreyou" 

strings = re.split(r"[^\w']+", text.lower()) 

# Use english dictionary to check if a word exists. 
dictionary = enchant.Dict("en_US") 
counts = defaultdict(int) 
for s in strings: 
    for word in get_substrings(s): 
     if (len(word) > 1 and dictionary.check(word)): 
      counts[word] += 1 

print counts 

Выход:

defaultdict ({ 'являются': 1, 'Ого': 1, 'а': 1, 'Ell': 3, 'о': 1, 'lo': 3, 'll': 3, 'yo': 1, 'how': 2, 'hare': 1, 'ho': 2, 'ow': 2, 'hell': 3, ' вы: 1, 'ha': 1, 'hello': 3, 're': 1, 'he': 3})

+0

Но это не нужный результат. Ад следует игнорировать, если за ним следует o и т. д. В общем, все слова, которые являются подстроками других слов в строке, следует игнорировать. –

Смежные вопросы