รายการและนับคำที่ไม่ซ้ำจากเอกสาร Word [ปิด]


0

ฉันต้องการนำเอกสาร Microsoft Word และสร้างสเปรดชีตของคำทั้งหมดที่มีอยู่ในเอกสารและจำนวนครั้งที่แต่ละคำปรากฏ

เช่น.,

cat    23
said   15
jumped 12
dog    7

นี่เป็นปัญหาที่ไม่ยุ่งยากหรือไม่ที่สามารถทำได้อย่างง่ายดายและตรงไปตรงมาโดยใช้ฟังก์ชั่นและฟีเจอร์ต่าง ๆ ของ Word หรือ Excel?

ถ้าไม่มีฟังก์ชั่นนี้จะพร้อมใช้งานในเครื่องมือแบบไม่ใช้งาน (ในกรณีนี้โปรดแนะนำสิ่งที่ฉันควรสอบถามเกี่ยวกับเว็บไซต์ Recs ซอฟต์แวร์) หรือต้องการโปรแกรมแบบกำหนดเองหรือไม่


โซลูชันของ Excel: ขั้นตอนที่ 1: แยกวิเคราะห์เอกสารเป็นคำแยกในคอลัมน์สเปรดชีต ขั้นตอนที่ 2: คำตอบที่เหลืออยู่ในคำตอบนี้: superuser.com/a/518655/364367 (ดูตัวอย่างที่เชื่อมโยง)
fixer1234

คำตอบ:


3

นอกเหนือจาก 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

ใช้ 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

หมายเหตุ: (1) จากการออกแบบ (แต่ไม่มีเอกสาร) ชุดคำสั่งนี้จะไม่สนใจ (ยกเว้น) คำว่า "the", "a", "จาก", "คือ", "เป็น", "ถึง", "โดย" “ เป็น”,“ และ” และ“ เป็น” คุณสามารถแก้ไขรหัสเพื่อเปลี่ยนแปลงรายการนี้ได้เล็กน้อย (2) ดูเหมือนว่าจะมีข้อบกพร่อง: "คำ" ถูกปฏิเสธว่าอยู่นอกช่วงถ้า If SingleWord < "a" Or SingleWord > "z". ผลลัพธ์นี้ในคำที่ขึ้นต้นด้วย“ z” จะถูกละเว้น มาก การทดสอบอย่างรวดเร็ว (ฉันจะไม่ทำให้เกียรติโดยเรียกว่า "การทดสอบ") แนะนำว่าสิ่งนี้สามารถแก้ไขได้โดยการเปลี่ยน > "z" ไปยัง >= "{".
Scott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.