dynamic-nmf, 非负矩阵分解的动态话题建模

分享于 

16分钟阅读

GitHub

  繁體 雙語
Dynamic Topic Modeling via Non-negative Matrix Facotirzation
  • 源代码名称:dynamic-nmf
  • 源代码网址:http://www.github.com/derekgreene/dynamic-nmf
  • dynamic-nmf源代码文档
  • dynamic-nmf源代码下载
  • Git URL:
    git://www.github.com/derekgreene/dynamic-nmf.git
    Git Clone代码到本地:
    git clone http://www.github.com/derekgreene/dynamic-nmf
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/derekgreene/dynamic-nmf
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    基于动态主题模型的动态非

    摘要

    标准主题建模方法假设文档顺序不重要,使它们不适合时间戳语料库。 相反,动态主题建模方法跟踪语言的变化和主题随着时间的推移而变化。 通过非负矩阵分解( 非负 NMF ),我们开发了两个级别的动态主题模型,在时间上链接文本源。

    这里方法的详细信息将在以下文件( 链接 ) 中描述:

    
    Exploring the Political Agenda of the European Parliament Using a Dynamic Topic Modeling Approach
    
    
    Derek Greene, James P. Cross. Political Analysis, 2017.
    
    
    
    

    这个存储库包含了上述方法的python 参考实现。

    依赖项

    测试 python 2.7和 python 3.5,并要求以下软件包,这些软件包可以通过 PIP:

    基本用法

    要执行动态主题建模,文档的输入语料库应该由纯文本文件( 每个文件一个文档) 组成,组织成两个或者多个子目录。 每个子目录应对应于唯一的时间窗,表示不同的时间间隔。 当它们的字母顺序对应于它们在时间( 比如,2001,2002 ;month1,month2,month3 ;2010 -q1,2010 -q2,2010 -q3 ) 中的顺序时,这些子目录的名称是任意的。

    动态主题建模过程由以下三个步骤组成。 存档'数据/示例。zip'包含 1,324个新闻文章的示例语料库,其中分为3 个时间 Windows ( month1,month2,month3 ),用于说明这些步骤。

    步骤 1: 预处理

    在应用动态主题建模之前,第一步是从每个时间窗口( 例如 ) 处理文档。 子目录),为那些 Windows 生成一个文档术语 matrix。 这包括标记文档,删除常用停止词,并为时间窗口构建文档术语矩阵。 在下面的示例中,我们解析'数据/示例'的子目录中的所有. txt 文件。 输出文件将存储在'数据'目录中。 注意,下面的选项表明我们希望在编写每个矩阵之前应用术语加权和文档长度。

    
    python prep-text.py data/sample/month1 data/sample/month2 data/sample/month3 -o data --tfidf --norm
    
    
    
    

    这个过程的结果是Joblib二进制文件( *。pkl和 *.npy) 写入目录'数据的集合,其中每个前缀对应于每个时间窗口的NAME ( 比如 )。 month1,month2等。

    步骤 2: 窗口主题建模

    处理数据后,下一步是生成窗口主题在每个时间窗口的每个进程数据中都创建一个主题模型 NMF。 对于示例数据,我们将它的应用到三个月。 如果要对每个窗口使用相同数量的主题( 比如。 5主题),我们可以运行以下内容,它的中的结果将写入目录'输出':

    
    python find-window-topics.py data/*.pkl -k 5 -o out
    
    
    
    

    当进程完成时,我们可以查看 descriptiors ( 例如。 所得到的窗口主题的顶级术语如下所示:

    
    python display-topics.py out/month1_windowtopics_k05.pkl out/month2_windowtopics_k05.pkl out/month3_windowtopics_k05.pkl
    
    
    
    

    顶级术语和文档id可以从NMF结果文件导出到使用'导出 csv。py'的两个单独的逗号分隔文件。 例如要导出单个结果 file:的最高 50个术语和文档 id

    
    python export-csv.py out/month1_windowtopics_k05.pkl -t 50
    
    
    
    
    步骤 3: 动态主题建模

    创建窗口主题后,我们将时间 Windows 结果合并为动态主题,即在多个时间段 across span。 如果要指定固定数量的动态主题( 比如。 在运行时,可以运行以下命令,其中结果将写入目录:

    
    python find-dynamic-topics.py out/month1_windowtopics_k05.pkl out/month2_windowtopics_k05.pkl out/month3_windowtopics_k05.pkl -k 5 -o out
    
    
    
    

    在这种情况下,结果将写入'输出/dynamictopics_k05.pkl'。 当进程完成后,我们可以使用'显示主题。py'查看动态主题 descriptiors:

    
    python display-topics.py out/dynamictopics_k05.pkl
    
    
    
    

    对于样例语料库,5动态主题的最高 10项的输出应该如下所示:

    
    +------+------------+-----------+------------+--------+----------+
    
    
    | Rank | D01 | D02 | D03 | D04 | D05 |
    
    
    +------+------------+-----------+------------+--------+----------+
    
    
    | 1 | blair | chelsea | people | best | growth |
    
    
    | 2 | labour | game | mobile | band | economy |
    
    
    | 3 | election | club | users | music | oil |
    
    
    | 4 | government | united | software | film | sales |
    
    
    | 5 | minister | arsenal | microsoft | album | prices |
    
    
    | 6 | brown | league | technology | awards | market |
    
    
    | 7 | party | players | net | show | bank |
    
    
    | 8 | prime | cup | phone | number | economic |
    
    
    | 9 | howard | liverpool | computer | award | profits |
    
    
    | 10 | told | football | security | top | company |
    
    
    +------+------------+-----------+------------+--------+----------+
    
    
    
    

    高级用法

    上面的示例涉及使用手动指定的主题数量,例如窗口主题和动态主题。 在这个数字未知的情况下,自动或者半自动选择多个主题是不可以能的。 这个包包含了TC-W2V主题一致性度量的实现,可以用于比较不同主题模型,然后选择带有适当数量主题的模型。 有关TC-W2V的更多详细信息包括在本文中:

    
    An Analysis of the Coherence of Descriptors in Topic Modeling
    
    
    D. O'Callaghan, D. Greene, J. Carthy, P. Cunningham. 
    
    
    Expert Systems with Applications (ESWA), 2015.
    
    
    
    

    方法涉及许多步骤,如下所列。 再次使用示例语料库说明这些步骤。

    步骤 1: 构建Word2Vec模型

    我们还需要从语料库中的所有文档构建Word2Vec模型,以制作输入文本语料库。 脚本'prep-word2vec。py'使用 Gensim 构建 Skipgram ( SG ) Word2Vec模型。 指定子目录中的所有文本文件都用于构建模型,该模型被写入到文件'输出/w2v-model。bin'。

    
    python prep-word2vec.py data/sample -o out -m sg
    
    
    
    
    步骤 2: 窗口主题建模

    然后,基于前生成的Word2Vec模型,对每个时间窗口中的主题数的取值范围进行了讨论,并提出了相应的解决方法。 我们使用相同的'find-window-topics。py'脚本,但是指定一个逗号分隔的值范围来尝试 ( kmin,kmax ) ( 比如 )。 4,10将测试从 k=4到 k=10的所有主题数,并指定Word2Vec模型 file:的路径

    
    python find-window-topics.py data/*.pkl -k 4,10 -o out -m out/w2v-model.bin -w selected.csv
    
    
    
    

    脚本将对每个 k的每个值应用 NMF,每次都写入一个结果文件,每次都将结果文件写入到。 上面的示例数据的输出还包括以下 3个时间 Windows的主题数目的以下建议:

    
    Top recommendations for number of topics for 'month1': 5,6,7
    
    
    ...
    
    
    Top recommendations for number of topics for 'month2': 8,10,7
    
    
    ...
    
    
    Top recommendations for number of topics for 'month3': 8,6,10
    
    
    
    

    每个窗口推荐的主题数量都将存储在 selected.csv 中

    步骤 3: 动态主题建模

    通过运行脚本'find-dynamic-topics。py'和指定逗号分隔范围,以及在整个语料库上建立的Word2Vec模型的逗号分隔范围,我们还可以运行自动选择的数量:

    
    python find-dynamic-topics.py out/month1_windowtopics_k05.pkl out/month2_windowtopics_k08.pkl out/month3_windowtopics_k08.pkl -k 4,10 -o out -m out/w2v-model.bin 
    
    
    
    

    将这里范围应用于范围 [4,10]的示例语料库将导致 5主题的建议:

    
    Top recommendations for number of dynamic topics: 5,10,6
    
    
    
    

    相应的结果将被写入'输出/dynamictopics_k05.pkl'。 当进程完成后,我们可以使用以下方法查看动态主题 descriptiors:

    
    python display-topics.py out/dynamictopics_k05.pkl
    
    
    
    

    对于样例语料库,5动态主题的最高 10项的输出应该类似于:

    
    +------+------------+-----------+------------+--------+----------+
    
    
    | Rank | D01 | D02 | D03 | D04 | D05 |
    
    
    +------+------------+-----------+------------+--------+----------+
    
    
    | 1 | people | chelsea | blair | best | growth |
    
    
    | 2 | mobile | club | labour | band | economy |
    
    
    | 3 | users | game | election | music | oil |
    
    
    | 4 | software | arsenal | government | film | sales |
    
    
    | 5 | phone | united | party | album | market |
    
    
    | 6 | microsoft | league | brown | show | prices |
    
    
    | 7 | technology | players | minister | awards | bank |
    
    
    | 8 | net | liverpool | howard | number | economic |
    
    
    | 9 | computer | cup | prime | tv | profits |
    
    
    | 10 | security | football | tory | award | company |
    
    
    +------+------------+-----------+------------+--------+----------+
    
    
    
    
    检查结果

    从每个窗口跟踪每个窗口的各个主题,运行脚本'track-dynamic-topics。py',指定动态主题建模的文件路径,如所有选定的单个窗口主题模型( 按时间窗口排序)的路径。 确保窗口主题文件是用于生成动态主题的主题文件。

    注意,单个时间窗口中的多个主题可以与单个动态主题相关。 在上面的示例中,要查看对所有动态主题的跟踪,请运行:

    
    python track-dynamic-topics.py out/dynamictopics_k05.pkl out/month1_windowtopics_k05.pkl out/month2_windowtopics_k08.pkl out/month3_windowtopics_k08.pkl
    
    
    
    

    要只查看动态主题的子集,请指定一个或者多个主题编号逗号:

    
    python track-dynamic-topics.py out/dynamictopics_k05.pkl out/month1_windowtopics_k05.pkl out/month2_windowtopics_k08.pkl out/month3_windowtopics_k08.pkl -d 1,4
    
    
    
    

    对于示例语料库,跟踪动态主题D01和D04将包含整个动态主题和关联时间窗主题的顶级术语:

    
    - Dynamic Topic: D01
    
    
    +------+------------+-------------+------------+------------+-------------+-------------+
    
    
    | Rank | Overall | Window 1 | Window 2 | Window 3 | Window 3(2) | Window 3(3) |
    
    
    +------+------------+-------------+------------+------------+-------------+-------------+
    
    
    | 1 | people | microsoft | people | broadband | virus | mobile |
    
    
    | 2 | mobile | mobile | technology | tv | spam | phone |
    
    
    | 3 | users | users | phone | digital | software | phones |
    
    
    | 4 | software | software | users | high | mail | camera |
    
    
    | 5 | phone | people | computer | dvd | security | mobiles |
    
    
    | 6 | microsoft | security | software | service | attacks | people |
    
    
    | 7 | technology | net | sites | bt | net | cameras |
    
    
    | 8 | net | information | site | people | microsoft | handsets |
    
    
    | 9 | computer | programs | net | definition | users | technology |
    
    
    | 10 | security | computer | microsoft | technology | search | video |
    
    
    +------+------------+-------------+------------+------------+-------------+-------------+
    
    
    - Dynamic Topic: D04
    
    
    +------+---------+----------+----------+-------------+----------+
    
    
    | Rank | Overall | Window 1 | Window 2 | Window 2(2) | Window 3 |
    
    
    +------+---------+----------+----------+-------------+----------+
    
    
    | 1 | best | film | album | show | music |
    
    
    | 2 | band | best | band | tv | band |
    
    
    | 3 | music | awards | number | series | best |
    
    
    | 4 | film | award | chart | bbc | album |
    
    
    | 5 | album | actor | music | super | rock |
    
    
    | 6 | show | director | awards | channel | show |
    
    
    | 7 | awards | oscar | best | music | singer |
    
    
    | 8 | number | films | song | jackson | number |
    
    
    | 9 | tv | actress | single | viewers | song |
    
    
    | 10 | award | star | top | television | awards |
    
    
    +------+---------+----------+----------+-------------+----------+
    
    
    
    

    创建分区文件( 例如。 针对完整语料库中所有文档的单个成员主题模型,请运行:

    
    python create-dynamic-partition.py -o out/dynamic-combined.pkl out/dynamictopics_k05.pkl out/month1_windowtopics_k05.pkl out/month2_windowtopics_k08.pkl out/month3_windowtopics_k08.pkl
    
    
    
    

    模式  MAT  动态  FACT  Modeling  Matrix