【问题标题】:Counting occurrence of multiple words Python计算多个单词Python的出现
【发布时间】:2018-07-04 17:38:00
【问题描述】:

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

regexDict =    
{u'item_4278': [u'occupational', u'position', u'job'],
u'item_4279': [u'job', u'blue', u'collar'],
u'item_4276': [u'job', u'civil', u'service'], 
...}

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

以下:

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.

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

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

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

目前,我得到的只有这个,但还远远不能令人满意:

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)

最后,我想用分数过滤矩阵,使每个文档的计数仅在 5-10 之间。 总而言之,写得很紧凑(但显然不能正常工作:-)):

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

【问题讨论】:

  • 您似乎在使用pandas,您可能需要对其进行标记,以便熊猫用户提供更好的帮助。 :)
  • 我会的,非常感谢您的帮助。它在我的思考过程和学习如何使用 SO 方面帮助了我很多:-)
  • 所有项目(如蓝色、衣领和工作)都应该出现在文档中吗?如果 3 个单词中只有 2 个出现怎么办?还有你说的“有点接近”是什么意思?
  • 如果文档中只有 1 或 2 个单词出现,它应该得到 0 分。重要的是所有单词都出现在文档中! :) 有点接近,我的意思是如果它说“这是一个文本。这些句子不包含有趣的词。我的工作是公务员。前一句确实包含有趣的词”,'工作'' Civil' 和 'service' 在整个文档中看起来非常接近,因此该文档的 item_4276 得分为 1。
  • 你可能想看看这个。这甚至可能是重复的:stackoverflow.com/questions/17573814/…

标签: python pandas dictionary feature-extraction


【解决方案1】:

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

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

【讨论】:

  • 嗨@rnso,感谢您的评论!如前所述,我想计算单词组合在文档中出现的频率。让我用到目前为止的内容编辑我的问题!
猜你喜欢
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多