📜  Python 3 中的文本分析

📅  最后修改于: 2021-10-20 10:30:25             🧑  作者: Mango

书籍/文件的内容分析

书面文本中的模式在所有作者或语言中并不相同。这使语言学家能够研究原始语言或文本的潜在作者身份,而这些特征并不直接为人所知,例如美国革命的联邦党论文。

目标:在本案例研究中,我们将检查来自不同作者和不同语言的书籍收藏中的个别书籍的属性。更具体地说,我们将查看书籍长度、独特单词的数量以及这些属性如何按语言或作者身份。

来源: Project Gutenberg 是最古老的数字图书图书馆。它旨在对文化作品进行数字化和存档,目前包含 50,000 多本书,全部以前出版过,现在可以电子版。从这里下载一些英文和法文书籍以及来自此处的葡萄牙语和德语书籍以供分析。将所有这些书籍放在一个名为 Books 的文件夹中,其中包含子文件夹 English、French、German 和 Potugese。

文本中的词频

所以我们要构建一个函数来计算文本中的词频。我们将考虑一个示例测试文本,然后将示例文本替换为我们刚刚下载的书籍的文本文件。因为我们要统计词频,因此大写和小写字母是一样的。我们将整个文本转换为小写并保存。

text = "This is my test text. We're keeping this text short to keep things manageable."
text = text.lower()

词频可以通过多种方式统计。我们将要编写代码,两种方式(仅供知识)。一种使用for循环,另一种使用来自集合的Counter,证明比前一种更快。该函数将返回一个包含唯一单词及其频率作为键值对的字典。所以,我们编码:

from collections import Counter 
  
# counts word frequency
def count_words(text):                  
    skips = [".", ", ", ":", ";", "'", '"'] 
    for ch in skips: 
        text = text.replace(ch, "") 
    word_counts = {} 
    for word in text.split(" "): 
        if word in word_counts: 
            word_counts[word]+= 1 
        else: 
            word_counts[word]= 1 
    return word_counts 
  
    # >>>count_words(text) You can check the function 
  
# counts word frequency using
# Counter from collections 
def count_words_fast(text):     
    text = text.lower() 
    skips = [".", ", ", ":", ";", "'", '"'] 
    for ch in skips: 
        text = text.replace(ch, "") 
    word_counts = Counter(text.split(" ")) 
    return word_counts 
  
    # >>>count_words_fast(text) You can check the function 

输出:输出是一个字典,以样本文本的唯一词为键,每个词的频率为值。比较两个函数的输出,我们有:

将书籍读入Python:因为我们成功地使用示例文本测试了我们的词频函数。现在,我们将使用作为文本文件下载的书籍对函数进行文本处理。我们将创建一个名为 read_book 的函数() 它将在Python读取我们的书籍并将其作为一个长字符串保存在一个变量中并返回它。函数的参数将是要读取的 book.txt 的位置,并将在调用函数传递。

#read a book and return it as a string
def read_book(title_path):  
    with open(title_path, "r", encoding ="utf8") as current_file:
        text = current_file.read()
        text = text.replace("\n", "").replace("\r", "")
    return text

Total Unique words:我们将设计另一个名为 word_stats() 的函数,它将词频字典(count_words_fast()/count_words() 的输出)作为参数。该函数将返回唯一词的总数(sum /total 词频字典中的键)和一个 dict_values 将它们的总数保存在一起,作为一个元组。

# word_counts = count_words_fast(text)
def word_stats(word_counts):      
    num_unique = len(word_counts) 
    counts = word_counts.values() 
    return (num_unique, counts) 

调用函数:所以,最后我们要读一本书,比如英文版的罗密欧与朱丽叶,从函数中收集词频、唯一词、唯一词总数等信息。

text = read_book("./Books / English / shakespeare / Romeo and Juliet.txt")
  
word_counts = count_words_fast(text)         
(num_unique, counts) = word_stats(word_counts)
print(num_unique, sum(counts)) 
Output: 5118 40776

借助我们创建的函数,我们知道英文版的罗密欧与朱丽叶有5118个独特的词,独特词的频率总和为40776。我们可以知道哪个词出现的次数最多在书中& 可以玩不同版本的书籍,不同语言的书籍,以了解它们及其在上述功能的帮助下的统计信息。

绘制书籍的特征

我们将使用 matplotlib 绘制(i)书籍长度与所有不同语言书籍的唯一词数。我们将导入 pandas 以创建一个 Pandas 数据框,它将书籍信息作为列保存。我们将对这些列进行分类按不同的类别,例如 – “语言”、“作者”、“标题”、“长度”和“独特”。要沿 x 轴绘制书籍长度和沿 y 轴绘制独特单词的数量,我们编码:

import os 
import pandas as pd 
  
book_dir = "./Books"
os.listdir(book_dir) 
  
stats = pd.DataFrame(columns =("language",
                               "author",
                               "title",
                               "length",
                               "unique")) 
  
# check >>>stats 
title_num = 1
for language in os.listdir(book_dir): 
    for author in os.listdir(book_dir+"/"+language): 
        for title in os.listdir(book_dir+"/"+language+"/"+author):
              
            inputfile = book_dir+"/"+language+"/"+author+"/"+title 
            print(inputfile) 
            text = read_book(inputfile) 
            (num_unique, counts) = word_stats(count_words_fast(text)) 
            stats.loc[title_num]= language,
            author.capitalize(),
            title.replace(".txt", ""), 
            sum(counts), num_unique 
            title_num+= 1
import matplotlib.pyplot as plt 
plt.plot(stats.length, stats.unique, "bo-") 
  
plt.loglog(stats.length, stats.unique, "ro") 
  
stats[stats.language =="English"] #to check information on english books 
      
plt.figure(figsize =(10, 10)) 
subset = stats[stats.language =="English"] 
plt.loglog(subset.length,
           subset.unique,
           "o",
           label ="English",
           color ="crimson") 
  
subset = stats[stats.language =="French"] 
plt.loglog(subset.length,
           subset.unique,
           "o",
           label ="French",
           color ="forestgreen") 
  
subset = stats[stats.language =="German"] 
plt.loglog(subset.length,
           subset.unique,
           "o",
           label ="German",
           color ="orange") 
  
subset = stats[stats.language =="Portuguese"] 
plt.loglog(subset.length,
           subset.unique,
           "o",
           label ="Portuguese",
           color ="blueviolet") 
  
plt.legend() 
plt.xlabel("Book Length") 
plt.ylabel("Number of Unique words") 
plt.savefig("fig.pdf") 
plt.show() 

输出:我们绘制了两个图,第一个图将不同语言和作者的每本书都表示为一本书。第一个图中的红点代表一本书,它们由蓝线连接。对数图创建离散点 [红色这里]和线性图创建线性曲线[这里是蓝色],连接点。第二个图是一个对数图,它以不同的颜色显示不同语言的书籍[红色代表英语,绿色代表法语等]作为离散点。
这些图表有助于直观地分析不同来源生动书籍的事实。从图表中,我们了解到葡萄牙语书籍的篇幅更长,并且比德语或英语书籍拥有更多的独特词。绘制这些数据证明是很好的语言学家的帮助。


参考 :

  • edX –HarvardX – 使用Python进行研究
  • 类似的数据营练习
  • next_step : ML – 高级