Перечислите и посчитайте уникальные слова из документа Word
Я хочу взять документ Microsoft Word и создать электронную таблицу со всеми словами, содержащимися в документе, и числом раз, которое появляется каждое слово.
например,
cat 23
said 15
jumped 12
dog 7
Является ли это простой задачей, которую можно решить простым и понятным способом, используя встроенные функции и функции Word или Excel?
Если нет, доступна ли эта функциональность в готовых инструментах (в этом случае, пожалуйста, сообщите, что я должен узнать на сайте Software Recs), или потребуется индивидуальное программирование?
2 ответа
Помимо 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