n-gram的理解:使用sklearn CountVectorizer 实现n-gram

通过如下实验可知:

      12 + 11 =23

结论:

     相同语料库的情况下, ngram_range=(1,2)单词量的大小等于ngram_range=(1,1)与ngram_range=(2,2)单词量大小之和。

  

      注意如下复制的代码中df.head的显示中,第一列为行号。

1.ngram_range=(1,1)-->ngram1


# n-gram
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import jieba
data = ["为了祖国,为了胜利,向我开炮!向我开炮!",
        "记者:你怎么会说出那番话",
        "我只是觉得,对准我自己打"]
​
data = [" ".join(jieba.lcut(e)) for e in data] # 分词,并用" "连接+
print(type(data))
print(data)
​
vec = CountVectorizer(min_df=1, ngram_range=(1,1)) 
X = vec.fit_transform(data) # transform text to metrix
print(vec)
vec.get_feature_names() # get features
<class 'list'>
['为了 祖国 , 为了 胜利 , 向 我 开炮 ! 向 我 开炮 !', '记者 : 你 怎么 会 说出 那 番话', '我 只是 觉得 , 对准 我 自己 打']
CountVectorizer(analyzer='word', binary=False, decode_error='strict',
        dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ngram_range=(1, 1), preprocessor=None, stop_words=None,
        strip_accents=None, token_pattern='(?u)\\b\\w\\w+\\b',
        tokenizer=None, vocabulary=None)
['为了', '只是', '对准', '开炮', '怎么', '番话', '祖国', '胜利', '自己', '觉得', '记者', '说出']

print (vec.vocabulary_)
len(vec.vocabulary_)

//如下单词的数字与vec.get_feature_names()对应的序号对应。
{'为了': 0, '祖国': 6, '胜利': 7, '开炮': 3, '记者': 10, '怎么': 4, '说出': 11, '番话': 5, '只是': 1, '觉得': 9, '对准': 2, '自己': 8}
12

X
<3x12 sparse matrix of type '<class 'numpy.int64'>'
	with 12 stored elements in Compressed Sparse Row format>

//X为稀疏矩阵,所以打印出来如下形式
print(X)
  (0, 3)	2
  (0, 7)	1
  (0, 6)	1
  (0, 0)	2
  (1, 5)	1
  (1, 11)	1
  (1, 4)	1
  (1, 10)	1
  (2, 8)	1
  (2, 2)	1
  (2, 9)	1
  (2, 1)	1

X.toarray()
array([[2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1],
       [0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0]], dtype=int64)

df = pd.DataFrame(X.toarray(), columns=vec.get_feature_names()) # to DataFrame
df.head()
为了	只是	对准	开炮	怎么	番话	祖国	胜利	自己	觉得	记者	说出
0	2	0	0	2	0	0	1	1	0	0	0	0
1	0	0	0	0	1	1	0	0	0	0	1	1
2	0	1	1	0	0	0	0	0	1	1	0	0

df.shape
(3, 12)

词典包含为12个单词

2.ngram_range=(2,2)-->-->ngram2

# n-gram
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import jieba
data = ["为了祖国,为了胜利,向我开炮!向我开炮!",
        "记者:你怎么会说出那番话",
        "我只是觉得,对准我自己打"]
# n-gram
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import jieba
data = ["为了祖国,为了胜利,向我开炮!向我开炮!",
        "记者:你怎么会说出那番话",
        "我只是觉得,对准我自己打"]
​
data = [" ".join(jieba.lcut(e)) for e in data] # 分词,并用" "连接
​
vec1 = CountVectorizer(min_df=1, ngram_range=(2,2)) 
X1 = vec1.fit_transform(data) # transform text to metrix
vec1.get_feature_names() # get features
['为了 祖国',
 '为了 胜利',
 '只是 觉得',
 '对准 自己',
 '开炮 开炮',
 '怎么 说出',
 '祖国 为了',
 '胜利 开炮',
 '觉得 对准',
 '记者 怎么',
 '说出 番话']


​print (vec1.vocabulary_)
len(vec1.vocabulary_)

{'为了 祖国': 0, '祖国 为了': 6, '为了 胜利': 1, '胜利 开炮': 7, '开炮 开炮': 4, '记者 怎么': 9, '怎么 说出': 5, '说出 番话': 10, '只是 觉得': 2, '觉得 对准': 8, '对准 自己': 3}
11

df1 = pd.DataFrame(X1.toarray(), columns=vec1.get_feature_names()) # to DataFrame
df1.head()
为了 祖国	为了 胜利	只是 觉得	对准 自己	开炮 开炮	怎么 说出	祖国 为了	胜利 开炮	觉得 对准	记者 怎么	说出 番话
0	1	1	0	0	1	0	1	1	0	0	0
1	0	0	0	0	0	1	0	0	0	1	1
2	0	0	1	1	0	0	0	0	1	0	0

df1.shape
df1.shape
(3, 11)

词典包含11个单词

3.ngram_range=(1,2)--->同时包含-->ngram1和-->ngram2

# n-gram
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import jieba
data = ["为了祖国,为了胜利,向我开炮!向我开炮!",
        "记者:你怎么会说出那番话",
        "我只是觉得,对准我自己打"]
​
data = [" ".join(jieba.lcut(e)) for e in data] # 分词,并用" "连接
​
vec2 = CountVectorizer(min_df=1, ngram_range=(1,2)) 
X2 = vec2.fit_transform(data) # transform text to metrix
vec2.get_feature_names() # get features
['为了',
 '为了 祖国',
 '为了 胜利',
 '只是',
 '只是 觉得',
 '对准',
 '对准 自己',
 '开炮',
 '开炮 开炮',
 '怎么',
 '怎么 说出',
 '番话',
 '祖国',
 '祖国 为了',
 '胜利',
 '胜利 开炮',
 '自己',
 '觉得',
 '觉得 对准',
 '记者',
 '记者 怎么',
 '说出',
 '说出 番话']


print (vec2.vocabulary_)
len(vec2.vocabulary_)

{'为了': 0, '祖国': 12, '胜利': 14, '开炮': 7, '为了 祖国': 1, '祖国 为了': 13, '为了 胜利': 2, '胜利 开炮': 15, '开炮 开炮': 8, '记者': 19, '怎么': 9, '说出': 21, '番话': 11, '记者 怎么': 20, '怎么 说出': 10, '说出 番话': 22, '只是': 3, '觉得': 17, '对准': 5, '自己': 16, '只是 觉得': 4, '觉得 对准': 18, '对准 自己': 6}
23

df2 = pd.DataFrame(X2.toarray(), columns=vec2.get_feature_names()) # to DataFrame
df2.head()
为了	为了 祖国	为了 胜利	只是	只是 觉得	对准	对准 自己	开炮	开炮 开炮	怎么	...	祖国 为了	胜利	胜利 开炮	自己	觉得	觉得 对准	记者	记者 怎么	说出	说出 番话
0	2	1	1	0	0	0	0	2	1	0	...	1	1	1	0	0	0	0	0	0	0
1	0	0	0	0	0	0	0	0	0	1	...	0	0	0	0	0	0	1	1	1	1
2	0	0	0	1	1	1	1	0	0	0	...	0	0	0	1	1	1	0	0	0	0
3 rows × 23 columns


df2.shape
(3, 23)

词典包含23个单词。

------------

参考阅读:https://www.cnblogs.com/Lin-Yi/p/8974108.html

机器学习之路:python 文本特征提取 CountVectorizer, TfidfVectorizer

猜你喜欢

转载自blog.csdn.net/m0_37870649/article/details/81744977
今日推荐