计算多个单词Python的出现次数

时间:2018-01-25 12:55:16

标签: python pandas dictionary feature-extraction

我对Python很陌生,很抱歉我不知道。我想创建一个表,其中行是文档,列是标签。如果愿意,可以使用文档特征矩阵。每个标签代表任意数量的单词(通常为1,2或3个单词)。它们存储在一个字典中:

df = 
doc    text
doc1    My job is in civil service. I love my job blabla civil bla bla service bla. 
doc2    My job is in civil service. It is a job that you call blue collar. 
doc3    This is a document completely unrelated to the items.

现在,我有一些文档(在df中表示为字符串),我想知道一个标签中的单词出现在文档中的频率。

对于以下内容:

occupational\W+(?:\w+\W+){0,3}?position\W+(?:\w+\W+){0,3}?job\W+(?:\w+\W+){0,3}?

我想计算文档中值相互接近的次数,例如我创建的正则表达式:

        item_4278    item_4279    item_4276
Doc 1       0            0            2
Doc 2       0            1            1
Doc 3       0            0            0

期望的输出:

testdic = {
'item_1': r'occupational\W+(?:\w+\W+){0,3}?position\W+(?:\w+\W+){0,3}?job\W+(?:\w+\W+){0,3}?', 
'item_2': r'job\W+(?:\w+\W+){0,3}?blue\W+(?:\w+\W+){0,3}?collar\W+(?:\w+\W+){0,3}?',
'item_3': r'job\W+(?:\w+\W+){0,3}?civil\W+(?:\w+\W+){0,3}?service\W+(?:\w+\W+){0,3}?'
}

total = []
for key, item in testdic.iteritems():
    series = df.text.str.count(item)
    series = series.rename(key)
    total.append(series)
    total2 = pd.concat(total, axis=1)

编辑:如果文档中只出现1或2个单词,则得分为0.重要的是所有单词都出现在文档中! :)有点接近彼此,我的意思是,如果它说“这是一个文本。这些句子不包含有趣的单词。我的工作是公务员。前一句话确实包含有趣的单词”,“工作” Civil'和'service'在整个文档中看起来非常接近,因此item_4276的文档得分为1.

现在,我得到的只是这个,但它远非令人满意:

def interesting_items(doc, regexDict):
    for value in regexDict.values():
        df.loc[df['doc'] == doc, 'text'].iloc[0].str.count(value)
return count per regexDict.keys() if count > 5 and count < 10

最后,我想用分数过滤矩阵,每个文档的计数只有5-10。 总而言之,写得紧凑(但显然不能合作:-)):

{{1}}

1 个答案:

答案 0 :(得分:0)

可以使用以下函数来确定列表中的所有单词是否都存在于已发送的文本中:

def allpresent(text, wordlist):
    for word in wordlist:
        if text.find(word) == -1: 
            return False
    return True

然后可以使用以下代码获取新的数据帧:

newdf = pd.DataFrame(index=df.doc.tolist(), columns=labels.keys())
for rownum in range(len(df)):
    txt = df.text[rownum]
    for k,v in labels.items():
        if allpresent(df.text[rownum], v):
            newdf.loc[df.doc[rownum], k] = 1
        else:
            newdf.loc[df.doc[rownum], k] = 0

print(newdf)

输出:

     item_4278 item_4279 item_4276
doc1         0         0         1
doc2         0         1         1
doc3         0         0         0