python - 在python中计算窗口大小的缩放共现矩阵
问题描述
比如说,我有一个 CSV 格式的数据集,其中包含行中的句子/段落。假设,它看起来像这样:
df = ['ABX B', 'XB B']
现在,我可以生成如下所示的共现矩阵
A B X
A 0 2 1
B 2 0 4
X 1 4 0
这里,(A,B,X) 是单词。它说 B 出现在 X 存在的地方 = 4 倍我用于它的代码
def co_occurrence(sentences, window_size):
d = defaultdict(int)
vocab = set()
for text in sentences:
# preprocessing (use tokenizer instead)
text = text.lower().split()
# iterate over sentences
for i in range(len(text)):
token = text[i]
vocab.add(token) # add to vocab
next_token = text[i+1 : i+1+window_size]
for t in next_token:
key = tuple( sorted([t, token]) )
d[key] += 1
# formulate the dictionary into dataframe
vocab = sorted(vocab) # sort vocab
df = pd.DataFrame(data=np.zeros((len(vocab), len(vocab)), dtype=np.int16),
index=vocab,
columns=vocab)
for key, value in d.items():
df.at[key[0], key[1]] = value
df.at[key[1], key[0]] = value
return df
这个代码段的美妙之处在于它允许我选择窗口大小。这意味着如果一个特定的单词没有出现在总句子大小的固定范围内,那么它就会被忽略。但我想扩大规模。
所以这意味着如果一个词离目标词“to”很远,那么它将被分配较小的值。不幸的是,我找不到合适的解决方案。是否可以使用诸如 scikit-learn 之类的软件包?或者除了原始编码还有其他方法吗?
解决方案
这是一个实现,它可以根据输入句子中单词标记之间的距离选择性地缩放累积的共现值:
In [11]: sentences = ['from swerve of shore to bend of bay , brings'.split()]
In [12]: index, matrix = co_occurence_matrix(sentences, window=3, scale=True)
In [13]: cell = index['bend'], index['of']
In [14]: matrix[cell]
Out[14]: 1.3333333333333333
In [15]: index, matrix = co_occurence_matrix(sentences, window=3, scale=False)
In [16]: matrix[cell]
Out[16]: 2.0
In [17]: {w: matrix[index['to']][i] for w, i in index.items()}
Out[17]:
{',': 0.0,
'bend': 1.0,
'of': 1.0,
'bay': 0.3333333333333333,
'brings': 0.0,
'to': 0.0,
'from': 0.0,
'shore': 1.0,
'swerve': 0.3333333333333333}
推荐阅读
- azure-devops - 创建可以从另一个阶段或手动调用的阶段?
- python - 在 spacy 中自定义 Tokenizer
- python - 在 Jupyter Notebook 中显示多个 HTML 内容(循环中的 IFrame)
- python - 在 Tkinter 中使用“root.attributes('-type', 'splash')”的问题
- android - 底页没有完全隐藏android?
- apache-kafka - 卡夫卡无法启动。收到以下错误
- javascript - 如何在reactjs中制作点击按钮然后打开url
- reactjs - React:使用 React-router 从 url 中隐藏“参数”
- visual-studio-code - Visual Studio Code 是否能够像在 NeoVim 中一样记录和重放击键?
- ios - 升级到 0.63 后找不到模块“BrightcovePlayerSDK”