gpt4 book ai didi

python 根据前后单词进行单词分组

转载 作者:行者123 更新时间:2023-12-01 03:28:43 28 4
gpt4 key购买 nike

我正在尝试创建单词组。首先,我正在计算所有单词。然后我根据字数确定前 10 个单词。然后我想根据前 10 个单词创建 10 组单词。每组包含顶部单词之前和之后的所有单词。

我将调查结果存储在结构如下的 python pandas 数据框中

Question_ID | Customer_ID | Answer
1 234 Data is very important to use because ...
2 234 We value data since we need it ...

我还将答案列保存为字符串。

我使用以下代码查找单词前后的 3 个单词(实际上我必须在答案列中创建一个字符串)

answers_str = df.Answer.apply(str)
for value in answers_str:
non_data = re.split('data|Data', value)
terms_list = [term for term in non_data if len(term) > 0] # skip empty terms
substrs = [term.split()[0:3] for term in terms_list] # slice and grab first three terms
result = [' '.join(term) for term in substrs] # combine the terms back into substrings
print result

我一直在手动创建单词组 - 但有没有办法在 python 中做到这一点?

因此,根据上面显示的示例,包含字数统计的组将如下所示:

group "data": 
data : 2
important: 1
value: 1
need:1

然后当它遍历整个文件时,就会有另一组:

group "analytics:
analyze: 5
report: 7
list: 10
visualize: 16

这个想法是去掉“我们”、“到”、"is"——但如果不可能的话,我可以手动完成。

然后建立 10 个最常用的单词(按单词数),然后创建 10 个组,其中包含这些主要前 10 个单词前后的单词。

最佳答案

我们可以使用正则表达式来实现这一点。我们将使用这个正则表达式

((?:\b\w+?\b\s*){0,3})[dD]ata((?:\s*\b\w+?\b){0,3})

您可以自己测试一下 here ,提取每次数据出现之前和之后的三个单词

首先,让我们从字符串中删除所有我们不喜欢的单词。

import re

# If you're processing a lot of sentences, it's probably wise to preprocess
#the pattern, assuming that bad_words is the same for all sentences
def remove_words(sentence, bad_words):
pat = r'(?:{})'.format(r'|'.join(bad_words))
return re.sub(pat, '', sentence, flags=re.IGNORECASE)

我们想要获取每行数据周围的单词

data_pat = r'((?:\b\w+?\b\s*){0,3})[dD]ata((?:\s*\b\w+?\b){0,3})'
res = re.findall(pat, s, flags=re.IGNORECASE)

给我们一个字符串元组列表。我们希望获得这些字符串拆分后的列表。

from itertools import chain
list_of_words = list(chain.from_iterable(map(str.split, chain.from_iterable(map(chain, chain(res))))))

这不太漂亮,但确实有效。基本上,我们将元组从列表中取出,将字符串从每个元组中取出,然后拆分每个字符串,然后将所有字符串从列表中取出,最后将它们放入一个大列表中。

让我们将这一切与您的 pandas 代码放在一起。 pandas 不是我最擅长的领域,所以如果你看到一些奇怪的东西,请不要认为我没有犯一些基本的错误。

import re
from itertools import chain
from collections import Counter

def remove_words(sentence, bad_words):
pat = r'(?:{})'.format(r'|'.join(bad_words))
return re.sub(pat, '', sentence, flags=re.IGNORECASE)

bad_words = ['we', 'is', 'to']
sentence_list = df.Answer.apply(lambda x: remove_words(str(x), bad_words))
c = Counter()
data_pat = r'((?:\b\w+?\b\s*){0,3})data((?:\s*\b\w+?\b){0,3})'
for sentence in sentence_list:
res = re.findall(data_pat, sentence, flags=re.IGNORECASE)
words = chain.from_iterable(map(str.split, chain.from_iterable(map(chain, chain(res)))))
c.update(words)

我们使用的正则表达式的好处是所有复杂的部分都不关心我们使用的单词。稍微改变一下,我们就可以制作一个格式字符串

base_pat = r'((?:\b\w+?\b\s*){{0,3}}){}((?:\s*\b\w+?\b){{0,3}})'

这样

base_pat.format('data') == data_pat

因此,通过一些单词列表,我们希望收集有关key_words的信息

import re
from itertools import chain
from collections import Counter

def remove_words(sentence, bad_words):
pat = r'(?:{})'.format(r'|'.join(bad_words))
return re.sub(pat, '', sentence, flags=re.IGNORECASE)


bad_words = ['we', 'is', 'to']

sentence_list = df.Answer.apply(lambda x: remove_words(str(x), bad_words))

key_words = ['data', 'analytics']
d = {}

base_pat = r'((?:\b\w+?\b\s*){{0,3}}){}((?:\s*\b\w+?\b){{0,3}})'
for keyword in key_words:
key_pat = base_pat.format(keyword)
c = Counter()
for sentence in sentence_list:
res = re.findall(key_pat, sentence, flags=re.IGNORECASE)
words = chain.from_iterable(map(str.split, chain.from_iterable(map(chain, chain(res)))))
c.update(words)
d[keyword] = c

现在我们有一个字典d,它将关键字(例如dataanalytics)映射到映射的Counter不在我们的黑名单上的单词在相关关键字附近的计数。类似的东西

d= {'data'      : Counter({ 'important' : 2,
'very' : 3}),
'analytics' : Counter({ 'boring' : 5,
'sleep' : 3})
}

至于如何获取前 10 个单词,这基本上是 Counter 最擅长的事情。

key_words, _ = zip(*Counter(w for sentence in sentence_list for w in sentence.split()).most_common(10))

关于python 根据前后单词进行单词分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41188473/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com