使用 sklearn 为 python 中的变量 n-gram 计算 TF-IDF
Calculate TF-IDF using sklearn for variable-n-grams in python
问题:
使用 scikit-learn 查找特定词汇表的可变 n-gram 的命中数。
说明。
我从 here.
那里得到了例子
假设我有一个语料库,我想找出有多少命中(计数)具有如下词汇表:
myvocabulary = [(window=4, words=['tin', 'tan']),
(window=3, words=['electrical', 'car'])
(window=3, words=['elephant','banana'])
我这里所说的window是单词可以出现的单词跨度的长度。如下:
'tin tan'被击中(4字以内)
'tin dog tan'被击中(4字以内)
'tin dog cat tan 被击中(4个字以内)
'tin car sun eclipse tan' 未命中。 tin 和 tan 出现超过 4 个单词。
我只想计算 (window=4, words=['tin', 'tan']) 在文本中出现了多少次,其他的也一样然后将结果添加到 pandas 以计算 tf-idf 算法。
我只能找到这样的东西:
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(vocabulary = myvocabulary, stop_words = 'english')
tfs = tfidf.fit_transform(corpus.values())
其中词汇表是一个简单的字符串列表,可以是单个单词或几个单词。
除了 scikitlearn:
class sklearn.feature_extraction.text.CountVectorizer
ngram_range : tuple (min_n, max_n)
要提取的不同 n-gram 的 n 值范围的下限和上限。将使用满足 min_n <= n <= max_n 的所有 n 值。
也无济于事。
有什么想法吗?
谢谢。
我不确定是否可以使用 CountVectorizer
或 TfidfVectorizer
来完成。我已经编写了自己的函数来执行此操作,如下所示:
import pandas as pd
import numpy as np
import string
def contained_within_window(token, word1, word2, threshold):
word1 = word1.lower()
word2 = word2.lower()
token = token.translate(str.maketrans('', '', string.punctuation)).lower()
if (word1 in token) and word2 in (token):
word_list = token.split(" ")
word1_index = [i for i, x in enumerate(word_list) if x == word1]
word2_index = [i for i, x in enumerate(word_list) if x == word2]
count = 0
for i in word1_index:
for j in word2_index:
if np.abs(i-j) <= threshold:
count=count+1
return count
return 0
SAMPLE:
corpus = [
'This is the first document. And this is what I want',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?',
'I like coding in sklearn',
'This is a very good question'
]
df = pd.DataFrame(corpus, columns=["Test"])
您的 df
将如下所示:
Test
0 This is the first document. And this is what I...
1 This document is the second document.
2 And this is the third one.
3 Is this the first document?
4 I like coding in sklearn
5 This is a very good question
现在您可以按如下方式申请contained_within_window
:
sum(df.Test.apply(lambda x: contained_within_window(x,word1="this", word2="document",threshold=2)))
你得到:
2
您可以 运行 一个 for
循环来检查不同的实例。
你用这个来构建你的 pandas df
并在其上应用 TfIdf
,这很简单。
希望对您有所帮助!
问题: 使用 scikit-learn 查找特定词汇表的可变 n-gram 的命中数。
说明。 我从 here.
那里得到了例子假设我有一个语料库,我想找出有多少命中(计数)具有如下词汇表:
myvocabulary = [(window=4, words=['tin', 'tan']),
(window=3, words=['electrical', 'car'])
(window=3, words=['elephant','banana'])
我这里所说的window是单词可以出现的单词跨度的长度。如下:
'tin tan'被击中(4字以内)
'tin dog tan'被击中(4字以内)
'tin dog cat tan 被击中(4个字以内)
'tin car sun eclipse tan' 未命中。 tin 和 tan 出现超过 4 个单词。
我只想计算 (window=4, words=['tin', 'tan']) 在文本中出现了多少次,其他的也一样然后将结果添加到 pandas 以计算 tf-idf 算法。 我只能找到这样的东西:
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(vocabulary = myvocabulary, stop_words = 'english')
tfs = tfidf.fit_transform(corpus.values())
其中词汇表是一个简单的字符串列表,可以是单个单词或几个单词。
除了 scikitlearn:
class sklearn.feature_extraction.text.CountVectorizer
ngram_range : tuple (min_n, max_n)
要提取的不同 n-gram 的 n 值范围的下限和上限。将使用满足 min_n <= n <= max_n 的所有 n 值。
也无济于事。
有什么想法吗? 谢谢。
我不确定是否可以使用 CountVectorizer
或 TfidfVectorizer
来完成。我已经编写了自己的函数来执行此操作,如下所示:
import pandas as pd
import numpy as np
import string
def contained_within_window(token, word1, word2, threshold):
word1 = word1.lower()
word2 = word2.lower()
token = token.translate(str.maketrans('', '', string.punctuation)).lower()
if (word1 in token) and word2 in (token):
word_list = token.split(" ")
word1_index = [i for i, x in enumerate(word_list) if x == word1]
word2_index = [i for i, x in enumerate(word_list) if x == word2]
count = 0
for i in word1_index:
for j in word2_index:
if np.abs(i-j) <= threshold:
count=count+1
return count
return 0
SAMPLE:
corpus = [
'This is the first document. And this is what I want',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?',
'I like coding in sklearn',
'This is a very good question'
]
df = pd.DataFrame(corpus, columns=["Test"])
您的 df
将如下所示:
Test
0 This is the first document. And this is what I...
1 This document is the second document.
2 And this is the third one.
3 Is this the first document?
4 I like coding in sklearn
5 This is a very good question
现在您可以按如下方式申请contained_within_window
:
sum(df.Test.apply(lambda x: contained_within_window(x,word1="this", word2="document",threshold=2)))
你得到:
2
您可以 运行 一个 for
循环来检查不同的实例。
你用这个来构建你的 pandas df
并在其上应用 TfIdf
,这很简单。
希望对您有所帮助!