Vim, функция частоты слов и французские акценты - PullRequest
3 голосов
/ 23 сентября 2011

Недавно я обнаружил Совет Vim n ° 1531 (статистика частоты слов для файла).

Как и предполагалось, я поместил следующий код в мой .vimrc

function! WordFrequency() range
  let all = split(join(getline(a:firstline, a:lastline)), '\A\+')
  let frequencies = {}
  for word in all
    let frequencies[word] = get(frequencies, word, 0) + 1
  endfor
  new
  setlocal buftype=nofile bufhidden=hide noswapfile tabstop=20
  for [key,value] in items(frequencies)
    call append('$', key."\t".value)
  endfor
  sort i
endfunction
command! -range=% WordFrequency <line1>,<line2>call WordFrequency()

Работает нормально, за исключением акцентов и других французских особенностей (маленькая латинская лигатура a или o и т. Д.).

Что я должен добавить в эту функцию, чтобы она соответствовала моим потребностям?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

Для 8-битных символов вы можете попробовать изменить шаблон разделения с \A\+ на [^[:alpha:]]\+.

3 голосов
/ 23 сентября 2011

Шаблон \A\+ соответствует любому количеству последовательных неалфавитных символов, которые, к сожалению, включают многобайтовые символы, такие как наш любимый çàéô и друзья.

Это означает, что ваш текст разделен пробелами и многобайтовыми символами.

С \A\+, фраза

Rendez-vous après l'apéritif.

дает:

ap      1
apr     1
l       1
Rendez  1
ritif   1
s       1
vous    1

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

С этим шаблоном, \s\+, та же фраза дает:

après       1
l'apéritif. 1
Rendez-vous 1

что, я думаю, ближе к тому, что вы хотите.

Может потребоваться некоторая настройка, чтобы исключить знаки препинания.

0 голосов
/ 10 декабря 2014
function! WordFrequency() range
  " Whitespace and all punctuation characters except dash and single quote
  let wordSeparators = '[[:blank:],.;:!?%#*+^@&/~_|=<>\[\](){}]\+'
  let all = split(join(getline(a:firstline, a:lastline)), wordSeparators)
  "...
endfunction

Если все знаки пунктуации должны быть разделителями слов, выражение сокращается до

let wordSeparators = '[[:blank:][:punct:]]\+'
...