Python 计算多个单词的出现次数
我是Python新手,所以很抱歉我不知道。例如,我想创建一个表,其中行是文档,列是标签。文档特征矩阵(如果愿意)。每个标签表示任意数量的单词(通常为1、2或3个单词)。它们存储在dict中:Python 计算多个单词的出现次数,python,pandas,dictionary,feature-extraction,Python,Pandas,Dictionary,Feature Extraction,我是Python新手,所以很抱歉我不知道。例如,我想创建一个表,其中行是文档,列是标签。文档特征矩阵(如果愿意)。每个标签表示任意数量的单词(通常为1、2或3个单词)。它们存储在dict中: 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'serv
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。文档中出现所有单词非常重要!:)我的意思是,如果它说“这是一个文本。这些句子不包含有趣的词。我的工作是公务员。前一句确实包含有趣的词”,那么“职务”“公务员”和“公务员”在整个文档中看起来非常接近,因此文档的第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有趣的项目(doc、regexDict):
对于regexDict.values()中的值:
df.loc[df['doc']==doc,'text'].iloc[0].str.count(值)
如果计数大于5且计数小于10,则返回每个regexDict.keys()的计数
可以使用以下功能确定列表中的所有单词是否都存在于发送的文本中:
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
看起来您使用的是
pandas
,您可能希望对其进行标记,以便pandas用户能够提供更好的帮助。:)我会的,非常感谢你的帮助。这对我的思考过程和学习如何使用SO有很大帮助:-)所有项目(如蓝领、工作)都应该出现在文档中吗?如果3个单词中只有2个出现怎么办?另外,您所说的“彼此有些接近”是什么意思?如果文档中仅出现1或2个单词,则得分应为0。文档中出现所有单词非常重要!:)我的意思是,如果它说“这是一个文本。这些句子没有有趣的词。我的工作是公务员。前一句确实包含有趣的词”,那么“职务”“公务员”和“公务员”在整个文件中看起来非常接近,因此,文档的第_4276项得分为1。您可能想看看这个。这甚至可能是重复的:嗨@rnso,谢谢你的评论!如前所述,我想计算单词组合在文档中出现的频率。让我用到目前为止的内容来编辑我的问题!
item_4278 item_4279 item_4276
doc1 0 0 1
doc2 0 1 1
doc3 0 0 0