Liste e conte palavras únicas de um documento do Word [closed]

0

Eu quero pegar um documento do Microsoft Word e produzir uma planilha com todas as palavras contidas no documento e o número de vezes que cada palavra aparece.

por exemplo,

cat    23
said   15
jumped 12
dog    7

Esse é um problema básico que pode ser realizado de maneira simples e direta usando funções e recursos internos do Word ou do Excel?

Se não, essa funcionalidade está prontamente disponível em ferramentas prontas para uso (nesse caso, por favor, informe-se sobre o que devo perguntar no site Recs de Software), ou seria necessária programação personalizada?

    
por Super Chicken 28.02.2011 / 11:54

2 respostas

3

Além do VBA, é possível desenvolver esse aplicativo usando a API do OpenOffice para ler o conteúdo do documento do Word; processe-o e exporte os resultados como um arquivo CSV para abrir em um aplicativo de planilha.

No entanto, na verdade, são apenas algumas linhas de códigos se você estiver familiarizado com qualquer linguagem de programação. Por exemplo, em Python, você pode facilmente fazer assim:

Aqui definimos uma função simples que conta as palavras com uma lista

def countWords(a_list):
    words = {}
    for i in range(len(a_list)):
        item = a_list[i]
        count = a_list.count(item)
        words[item] = count
    return sorted(words.items(), key = lambda item: item[1], reverse=True)

O resto é manipular o conteúdo do documento. Primeiro cole-o:

content = """This is the content of the word document. Just copy paste it. 
It can be very very very very long and it can contain punctuation 
(they will be ignored) and numbers like 123 and 4567 (they will be counted)."""

Aqui, removemos a pontuação, EOL, parênteses, etc. e, em seguida, geramos uma lista de palavras para a nossa função:

import re

cleanContent = re.sub('[^a-zA-Z0-9]',' ', content)

wordList = cleanContent.lower().split()

Em seguida, executamos nossa função e armazenamos seu resultado (pares de contagem de palavras) em outra lista e imprimimos os resultados:

result = countWords(wordList)

for words in result:
    print(words)

Então o resultado é:

('very', 4)
('and', 3)
('it', 3)
('be', 3)
('they', 2)
('will', 2)
('can', 2)
('the', 2)
('ignored', 1)
('just', 1)
('is', 1)
('numbers', 1)
('punctuation', 1)
('long', 1)
('content', 1)
('document', 1)
('123', 1)
('4567', 1)
('copy', 1)
('paste', 1)
('word', 1)
('like', 1)
('this', 1)
('of', 1)
('contain', 1)
('counted', 1)

Você pode remover parênteses e vírgulas usando pesquisa / substituição, se quiser.

Tudo o que você precisa fazer é baixar o Python 3 , instalá-lo, abrir o IDLE (vem com o Python), substituir o conteúdo do seu documento do Word e execute os comandos um de cada vez e na ordem dada.

    
por 28.02.2011 / 13:40
2

Use o VBA. Uma macro (sub-rotina) para fazer exatamente o que você está solicitando está em esta página:

Sub WordFrequency()
    Const maxwords = 9000          'Maximum unique words allowed
    Dim SingleWord As String       'Raw word pulled from doc
    Dim Words(maxwords) As String  'Array to hold unique words
    Dim Freq(maxwords) As Integer  'Frequency counter for unique words
    Dim WordNum As Integer         'Number of unique words
    Dim ByFreq As Boolean          'Flag for sorting order
    Dim ttlwds As Long             'Total words in the document
    Dim Excludes As String         'Words to be excluded
    Dim Found As Boolean           'Temporary flag
    Dim j, k, l, Temp As Integer   'Temporary variables
    Dim ans As String              'How user wants to sort results
    Dim tword As String            '

    ' Set up excluded words
    Excludes = "[the][a][of][is][to][for][by][be][and][are]"

    ' Find out how to sort
    ByFreq = True
    ans = InputBox("Sort by WORD or by FREQ?", "Sort order", "WORD")
    If ans = "" Then End
    If UCase(ans) = "WORD" Then
        ByFreq = False
    End If

    Selection.HomeKey Unit:=wdStory
    System.Cursor = wdCursorWait
    WordNum = 0
    ttlwds = ActiveDocument.Words.Count

    ' Control the repeat
    For Each aword In ActiveDocument.Words
        SingleWord = Trim(LCase(aword))
        'Out of range?
        If SingleWord < "a" Or SingleWord > "z" Then
            SingleWord = ""
        End If
        'On exclude list?
        If InStr(Excludes, "[" & SingleWord & "]") Then
            SingleWord = ""
        End If
        If Len(SingleWord) > 0 Then
            Found = False
            For j = 1 To WordNum
                If Words(j) = SingleWord Then
                    Freq(j) = Freq(j) + 1
                    Found = True
                    Exit For
                End If
            Next j
            If Not Found Then
                WordNum = WordNum + 1
                Words(WordNum) = SingleWord
                Freq(WordNum) = 1
            End If
            If WordNum > maxwords - 1 Then
                j = MsgBox("Too many words.", vbOKOnly)
                Exit For
            End If
        End If
        ttlwds = ttlwds - 1
        StatusBar = "Remaining: " & ttlwds & ", Unique: " & WordNum
    Next aword

    ' Now sort it into word order
    For j = 1 To WordNum - 1
        k = j
        For l = j + 1 To WordNum
            If (Not ByFreq And Words(l) < Words(k)) _
              Or (ByFreq And Freq(l) > Freq(k)) Then k = l
        Next l
        If k <> j Then
            tword = Words(j)
            Words(j) = Words(k)
            Words(k) = tword
            Temp = Freq(j)
            Freq(j) = Freq(k)
            Freq(k) = Temp
        End If
        StatusBar = "Sorting: " & WordNum - j
    Next j

    ' Now write out the results
    tmpName = ActiveDocument.AttachedTemplate.FullName
    Documents.Add Template:=tmpName, NewTemplate:=False
    Selection.ParagraphFormat.TabStops.ClearAll
    With Selection
        For j = 1 To WordNum
            .TypeText Text:=Trim(Str(Freq(j))) _
              & vbTab & Words(j) & vbCrLf
        Next j
    End With
    System.Cursor = wdCursorNormal
    j = MsgBox("There were " & Trim(Str(WordNum)) & _
      " different words ", vbOKOnly, "Finished")
End Sub
    
por 28.02.2011 / 13:14