当前位置: 首页 > 面试题库 >

NLTK的高效术语文档矩阵

宗政楚
2023-03-14
问题内容

我正在尝试使用NLTK和熊猫创建术语文档矩阵。我写了以下函数:

def fnDTM_Corpus(xCorpus):
    import pandas as pd
    '''to create a Term Document Matrix from a NLTK Corpus'''
    fd_list = []
    for x in range(0, len(xCorpus.fileids())):
        fd_list.append(nltk.FreqDist(xCorpus.words(xCorpus.fileids()[x])))
    DTM = pd.DataFrame(fd_list, index = xCorpus.fileids())
    DTM.fillna(0,inplace = True)
    return DTM.T

运行它

import nltk
from nltk.corpus import PlaintextCorpusReader
corpus_root = 'C:/Data/'

newcorpus = PlaintextCorpusReader(corpus_root, '.*')

x = fnDTM_Corpus(newcorpus)

它适用于语料库中的一些小文件,但是 当我尝试使用4,000个文件(每个约2 kb)的语料库运行它时,出现 MemoryError

我想念什么吗?

我正在使用32位python。(在Windows 7、64位OS,Core Quad CPU,8 GB
RAM上)。我真的需要对这种大小的语料库使用64位吗?


问题答案:

感谢Radim和Larsmans。我的目标是要拥有一个与您在R tm中获得的DTM类似的DTM。我决定使用scikit-
learn,部分受此博客文章的启发。这是我想出的代码。

我将其发布在这里,希望其他人会发现它有用。

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer

def fn_tdm_df(docs, xColNames = None, **kwargs):
    ''' create a term document matrix as pandas DataFrame
    with **kwargs you can pass arguments of CountVectorizer
    if xColNames is given the dataframe gets columns Names'''

    #initialize the  vectorizer
    vectorizer = CountVectorizer(**kwargs)
    x1 = vectorizer.fit_transform(docs)
    #create dataFrame
    df = pd.DataFrame(x1.toarray().transpose(), index = vectorizer.get_feature_names())
    if xColNames is not None:
        df.columns = xColNames

    return df

在目录中的文本列表上使用它

DIR = 'C:/Data/'

def fn_CorpusFromDIR(xDIR):
    ''' functions to create corpus from a Directories
    Input: Directory
    Output: A dictionary with 
             Names of files ['ColNames']
             the text in corpus ['docs']'''
    import os
    Res = dict(docs = [open(os.path.join(xDIR,f)).read() for f in os.listdir(xDIR)],
               ColNames = map(lambda x: 'P_' + x[0:6], os.listdir(xDIR)))
    return Res
d1 = fn_tdm_df(docs = fn_CorpusFromDIR(DIR)['docs'],
          xColNames = fn_CorpusFromDIR(DIR)['ColNames'], 
          stop_words=None, charset_error = 'replace')


 类似资料:
  • 问题内容: 我是相当新的elasticsearch,使用6.5版。我的数据库包含网站页面及其内容,如下所示: 我已经能够执行一个简单的查询,该查询返回所有内容中包含“汽车”一词的文档(使用Python): 结果看起来像这样: “ _id”指的是一个域,所以我基本上回来了: abc.com def.com jkl.com 但我现在想知道如何往往是搜索关键词(“汽车”)出现 在 每个文档,如: abc

  • 我有一个带有标签列表的文档: 我有一个术语清单: 我想要一个查询,将返回在术语列表中有标签的文档-但没有其他术语。 因此,给定上面的列表,查询将返回,但不返回(因为它有一个术语不在术语列表中)。 我尝试使用过滤器执行查询,如下所示: 但那没用。 如何创建一个查询,在给定术语列表的情况下,该查询将匹配列表中仅包含术语而不包含其他术语的文档?换句话说,所有文档都应该包含一个标签列表,这些标签是所提供的

  • null 完整代码:

  • Lucene提到- 但是我们可以通过IndexWriter.setMaxFieldLength(int)对其进行配置。 我在ElasticSearch-http://localhost:9200/twitter中创建了一个索引,并发布了一个包含40,000个术语的文档。 映射- 我用message字段索引了一个文档,有40,000个术语-message:“text1text2....text400

  • 另外,类型中的所有文档都存储了上面提到的community的值。感谢帮助。