Перечислите и посчитайте уникальные слова из документа Word

4883
Super Chicken

Я хочу взять документ Microsoft Word и создать электронную таблицу со всеми словами, содержащимися в документе, и числом раз, которое появляется каждое слово.

например,

cat 23 said 15 jumped 12 dog 7 

Является ли это простой задачей, которую можно решить простым и понятным способом, используя встроенные функции Word или Excel?

Если нет, доступна ли эта функциональность в готовых инструментах (в этом случае, пожалуйста, сообщите, что я должен узнать на сайте Software Recs), или потребуется индивидуальное программирование?

0
Excel solution: Step 1: Parse the document into separate words in a spreadsheet column. Step 2: The remainder of the solution is in this answer: http://superuser.com/a/518655/364367 (see its linked example). fixer1234 8 лет назад 0

2 ответа на вопрос

3
Gani Simsek

Помимо 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), заменить содержимое вашего текстового документа и запускать команды по одной в указанном порядке.

2
nimizen

Используйте 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 
Notes: (1) By design (but not documented), this routine will ignore (exclude) the words “the”, “a”, “of”, “is”, “to”, “for”, “by”, “be”, “and”, and “are”. You can trivially edit the code to change this list. (2) There appears to be a bug: a “word” is rejected as out of range if `If SingleWord < "a" Or SingleWord > "z"`. This results in words beginning with “z” being ignored. A *very* quick experiment (I’m not going to dignify it by calling it a “test”) suggests that this can be fixed by changing `> "z"` to `>= "{"`. Scott 8 лет назад 0

Похожие вопросы