Я хочу взять документ Microsoft Word и произвести электронную таблицу всех слов, содержавшихся в документе и количестве раз, каждое слово появляется.
например,
cat 23
said 15
jumped 12
dog 7
Действительно ли это - проблема легкой задачи, которая может быть выполнена в простом, простом способе использовать встроенные функции и функции Word или Excel?
В противном случае действительно ли эта функциональность легко доступна в стандартных инструментах (в этом случае, советуйте тому, что я должен справиться на программном обеспечении о сайте Recs), или пользовательское программирование требовалось бы?
Кроме VBA, можно разработать такое приложение с помощью API OpenOffice для чтения содержания документа Word; обработайте его и экспортируйте результаты как файл CSV для открытия в приложении для обработки электронных таблиц.
Однако это на самом деле, только некоторые выравнивают кодов, если Вы знакомы с каким-либо языком программирования. Например, в Python можно легко сделать это как этот:
Здесь мы определяем простую функцию, которая считает слова, учитывая список
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)
Остальное должно управлять содержанием документа. Сначала вставьте его:
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)."""
Здесь мы удаляем пунктуацию, EOL, круглые скобки и т.д. и затем генерируем список слов для нашей функции:
import re
cleanContent = re.sub('[^a-zA-Z0-9]',' ', content)
wordList = cleanContent.lower().split()
Затем мы выполняем нашу функцию и храним ее результат (пары для подсчета количества слов) в другом списке и печатаем результаты:
result = countWords(wordList)
for words in result:
print(words)
Таким образом, результат:
('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)
Можно раскрыть скобки и запятую с помощью поиска/замены, если Вы хотите.
Все, что необходимо сделать, загружает Python 3, устанавливает его, открывает, IDLE (идет с Python), замените содержание документа слова и выполните команды по одному и в данном распоряжении.
Используйте VBA. Макрос (подпрограмма), чтобы сделать точно, что Вы запрашиваете, находится на этой странице:
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