用于计算频率图的词干词
Stemmed words to compute a frequency plot
我需要绘制词频:
2333
appartamento 321
casa 314
cè 54
case 43
...
但是,有些词的词干相同(那么它们的意思就差不多)。
在上面的例子中,casa
和 case
具有相同的含义(第一个是单数,第二个是复数名称,如 house
和 houses
)。
我读到可以使用 nltk.stem
解决此问题。因此,我尝试如下:
from nltk.stem import PorterStemmer
from nltk.stem import LancasterStemmer
train_df = (df['Frasi'].str.replace(r'[^\w\s]+', '').str.split(' ').value_counts())
porter = PorterStemmer()
lancaster=LancasterStemmer()
现在我应该 运行 为上面列表中的每个单词循环,使用 porter 和 Lancaster,但我不知道如何使用上面的列表来词干。
只是为了给你一些背景信息:上面的列表来自 phrases/sentences,保存在一个数据框中。我的数据框有很多列,包括这些词来自的列 Frasi
。
该列中包含的短语示例是:
Frasi
Ho comprato un appartamento in centro
Il tuo appartamento è stupendo
Quanti vani ha la tua casa?
Il mercato immobiliare è in crisi
....
我试图做的是清理句子,删除标点符号和停用词(但似乎空格仍在,如上面的单词列表所示)。
现在我需要使用有关词频的信息来绘制最常用的 10-20 个词,但不包括具有相似含义或相同词干的词。我应该指定所有后缀还是可以使用某些东西来自动化该过程?
对此有任何帮助都将非常有用。
使用NLTK
代码
import nltk
from nltk.tokenize import word_tokenize # https://www.tutorialspoint.com/python_data_science/python_word_tokenization.htm
from nltk.stem.snowball import SnowballStemmer # https://www.nltk.org/howto/stem.html
from nltk.probability import FreqDist # http://www.nltk.org/api/nltk.html?highlight=freqdist
from nltk.corpus import stopwords # https://www.geeksforgeeks.org/removing-stop-words-nltk-python/
def freq_dist(s, language):
" Frequency count based upon language"
# Language based stops words and stemmer
fr_stopwords = stopwords.words(language)
fr_stemmer = SnowballStemmer(language)
# Language based tokenization
words = word_tokenize(s, language = language)
return FreqDist(fr_stemmer.stem(w) for w in words if w.isalnum() and not w in fr_stopwords)
说明
Pandas DataFrame 中的初始数据。获取法语列作为字符串。
s = '\n'.join(df['French'].tolist())
上面的函数 freq_dist
对其输入字符串执行以下操作。
根据语言标记字符串
words = word_tokenize(s, language='french')
删除标点符号(即 " ? , . 等)
punctuation_removed = [w for w in words if w.isalnum()]
获取法语停用词
french_stopwords = set(stopwords.words('french')) # make set for faster lookup
删除停用词
without_stopwords = [w for w in punctuation_removed if not w in french_stopwords]
词干(也删除大小写)
获取法语词干分析器并应用词干分析器
french_stemmer = SnowballStemmer('french')
词干
stemmed_words = [french_stemmer.stem(w) for w in without_stopwords]
使用 FreqDist 进行频率分布
fDist = FreqDist(stemmed_words)
例子
数据帧:
French
0 Ho comprato un appartamento in centro
1 Il tuo appartamento è stupendo
2 Quanti vani ha la tua casa?
3 Il mercato immobiliare è in crisi
4 Qui vivra verra
5 L’habit ne fait pas le moine
6 Chacun voit midi à sa porte
7 Mieux vaut prévenir que guérir
8 Petit a petit, l’oiseau fait son nid
9 Qui court deux lievres a la fois, n’en prend a...
10 Qui n’avance pas, recule
11 Quand on a pas ce que l’on aime, il faut aimer...
12 Il n’y a pas plus sourd que celui qui ne veut ...
生成字符串
sentences = '\n'.join(df['French'].tolist())
生成字数
counts = freq_dist(sentences, 'french')
按字母顺序显示
results = sorted(counts.most_common(),
key=lambda x: x[0])
for k, v in results:
print(k, v)
a 5
aim 2
appartamento 2
aucun 1
avanc 1
cas 1
celui 1
centro 1
chacun 1
comprato 1
court 1
cris 1
deux 1
entendr 1
fait 2
faut 1
fois 1
guer 1
ha 1
hab 1
ho 1
il 3
immobiliar 1
in 2
l 1
lievr 1
mercato 1
mid 1
mieux 1
moin 1
nid 1
oiseau 1
pet 2
plus 1
port 1
prend 1
préven 1
quand 1
quant 1
qui 3
recul 1
sourd 1
stupendo 1
tu 1
tuo 1
van 1
vaut 1
verr 1
veut 1
vivr 1
voit 1
è 2
我需要绘制词频:
2333
appartamento 321
casa 314
cè 54
case 43
...
但是,有些词的词干相同(那么它们的意思就差不多)。
在上面的例子中,casa
和 case
具有相同的含义(第一个是单数,第二个是复数名称,如 house
和 houses
)。
我读到可以使用 nltk.stem
解决此问题。因此,我尝试如下:
from nltk.stem import PorterStemmer
from nltk.stem import LancasterStemmer
train_df = (df['Frasi'].str.replace(r'[^\w\s]+', '').str.split(' ').value_counts())
porter = PorterStemmer()
lancaster=LancasterStemmer()
现在我应该 运行 为上面列表中的每个单词循环,使用 porter 和 Lancaster,但我不知道如何使用上面的列表来词干。
只是为了给你一些背景信息:上面的列表来自 phrases/sentences,保存在一个数据框中。我的数据框有很多列,包括这些词来自的列 Frasi
。
该列中包含的短语示例是:
Frasi
Ho comprato un appartamento in centro
Il tuo appartamento è stupendo
Quanti vani ha la tua casa?
Il mercato immobiliare è in crisi
....
我试图做的是清理句子,删除标点符号和停用词(但似乎空格仍在,如上面的单词列表所示)。 现在我需要使用有关词频的信息来绘制最常用的 10-20 个词,但不包括具有相似含义或相同词干的词。我应该指定所有后缀还是可以使用某些东西来自动化该过程?
对此有任何帮助都将非常有用。
使用NLTK
代码
import nltk
from nltk.tokenize import word_tokenize # https://www.tutorialspoint.com/python_data_science/python_word_tokenization.htm
from nltk.stem.snowball import SnowballStemmer # https://www.nltk.org/howto/stem.html
from nltk.probability import FreqDist # http://www.nltk.org/api/nltk.html?highlight=freqdist
from nltk.corpus import stopwords # https://www.geeksforgeeks.org/removing-stop-words-nltk-python/
def freq_dist(s, language):
" Frequency count based upon language"
# Language based stops words and stemmer
fr_stopwords = stopwords.words(language)
fr_stemmer = SnowballStemmer(language)
# Language based tokenization
words = word_tokenize(s, language = language)
return FreqDist(fr_stemmer.stem(w) for w in words if w.isalnum() and not w in fr_stopwords)
说明
Pandas DataFrame 中的初始数据。获取法语列作为字符串。
s = '\n'.join(df['French'].tolist())
上面的函数 freq_dist
对其输入字符串执行以下操作。
根据语言标记字符串
words = word_tokenize(s, language='french')
删除标点符号(即 " ? , . 等)
punctuation_removed = [w for w in words if w.isalnum()]
获取法语停用词
french_stopwords = set(stopwords.words('french')) # make set for faster lookup
删除停用词
without_stopwords = [w for w in punctuation_removed if not w in french_stopwords]
词干(也删除大小写)
获取法语词干分析器并应用词干分析器
french_stemmer = SnowballStemmer('french')
词干
stemmed_words = [french_stemmer.stem(w) for w in without_stopwords]
使用 FreqDist 进行频率分布
fDist = FreqDist(stemmed_words)
例子
数据帧:
French
0 Ho comprato un appartamento in centro
1 Il tuo appartamento è stupendo
2 Quanti vani ha la tua casa?
3 Il mercato immobiliare è in crisi
4 Qui vivra verra
5 L’habit ne fait pas le moine
6 Chacun voit midi à sa porte
7 Mieux vaut prévenir que guérir
8 Petit a petit, l’oiseau fait son nid
9 Qui court deux lievres a la fois, n’en prend a...
10 Qui n’avance pas, recule
11 Quand on a pas ce que l’on aime, il faut aimer...
12 Il n’y a pas plus sourd que celui qui ne veut ...
生成字符串
sentences = '\n'.join(df['French'].tolist())
生成字数
counts = freq_dist(sentences, 'french')
按字母顺序显示
results = sorted(counts.most_common(),
key=lambda x: x[0])
for k, v in results:
print(k, v)
a 5
aim 2
appartamento 2
aucun 1
avanc 1
cas 1
celui 1
centro 1
chacun 1
comprato 1
court 1
cris 1
deux 1
entendr 1
fait 2
faut 1
fois 1
guer 1
ha 1
hab 1
ho 1
il 3
immobiliar 1
in 2
l 1
lievr 1
mercato 1
mid 1
mieux 1
moin 1
nid 1
oiseau 1
pet 2
plus 1
port 1
prend 1
préven 1
quand 1
quant 1
qui 3
recul 1
sourd 1
stupendo 1
tu 1
tuo 1
van 1
vaut 1
verr 1
veut 1
vivr 1
voit 1
è 2