Listen Sie eindeutige Wörter aus einem Word-Dokument auf und zählen Sie sie

4930
Super Chicken

Ich möchte ein Microsoft Word-Dokument mitnehmen und eine Tabelle aller im Dokument enthaltenen Wörter und die Häufigkeit, mit der jedes Wort angezeigt wird, erstellen.

z.B,

cat 23 said 15 jumped 12 dog 7 

Ist dies ein unkompliziertes Problem, das mit integrierten Funktionen und Funktionen von Word oder Excel auf einfache und unkomplizierte Weise gelöst werden kann?

Wenn nicht, ist diese Funktionalität in Standardwerkzeugen verfügbar (in welchem ​​Fall geben Sie bitte an, worauf ich mich auf der Software Recs-Website erkundigen sollte), oder wäre eine benutzerdefinierte Programmierung erforderlich?

0
Excel-Lösung: Schritt 1: Analysieren Sie das Dokument in separate Wörter in einer Tabellenspalte. Schritt 2: Der Rest der Lösung ist in dieser Antwort enthalten: http://superuser.com/a/518655/364367 (siehe das verknüpfte Beispiel). fixer1234 vor 7 Jahren 0

2 Antworten auf die Frage

3
Gani Simsek

Abgesehen von VBA kann eine solche Anwendung mithilfe der API von OpenOffice entwickelt werden, um den Inhalt des Word-Dokuments zu lesen. Verarbeiten Sie es und exportieren Sie die Ergebnisse als CSV-Datei, um sie in einer Tabellenkalkulationsanwendung zu öffnen.

Es sind jedoch nur ein paar Codezeilen, wenn Sie mit einer Programmiersprache vertraut sind. In Python zum Beispiel können Sie das ganz einfach so machen:

Hier definieren wir eine einfache Funktion, die Wörter zählt, denen eine Liste zugeordnet ist

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) 

Der Rest besteht darin, den Inhalt des Dokuments zu bearbeiten. Zuerst fügen Sie es ein:

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).""" 

Hier entfernen wir die Interpunktion, EOL, Klammern usw. und erstellen dann eine Wortliste für unsere Funktion:

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

Dann führen wir unsere Funktion aus und speichern ihr Ergebnis (Wortzahlpaare) in einer anderen Liste und drucken die Ergebnisse aus:

result = countWords(wordList)  for words in result: print(words) 

Das Ergebnis ist also:

('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) 

Sie können Klammern und Kommas mit Suchen / Ersetzen entfernen, wenn Sie möchten.

Alles, was Sie brauchen, um Python 3 herunterzuladen, zu installieren, IDLE zu öffnen (wird mit Python geliefert), den Inhalt Ihres Word-Dokuments zu ersetzen und die Befehle nacheinander und in der angegebenen Reihenfolge auszuführen.

2
nimizen

Verwenden Sie VBA. Ein Makro (Unterprogramm), das genau das tut, was Sie anfordern, finden Sie auf dieser Seite:

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 
Anmerkungen: (1) Diese Routine ignoriert die Wörter "the", "a", "of", "is", "to", "for", "by", (aber nicht dokumentiert). "Sein", "und" und "sind". Sie können den Code einfach bearbeiten, um diese Liste zu ändern. (2) Es scheint einen Fehler zu geben: Ein "Wort" wird als "out of range" zurückgewiesen, wenn "If SingleWord <" ein "oder SingleWord>" z "`. Dies führt dazu, dass Wörter, die mit "z" beginnen, ignoriert werden. Ein * sehr * schnelles Experiment (ich werde es nicht als "Test" bezeichnen) legt nahe, dass dies behoben werden kann, indem `>" z "` in `> =" {"` geändert wird. Scott vor 7 Jahren 0