用于计算频率图的词干词

Stemmed words to compute a frequency plot

我需要绘制词频:

                2333
appartamento    321
casa            314
cè               54 
case             43
                ... 

但是,有些词的词干相同(那么它们的意思就差不多)。 在上面的例子中,casacase 具有相同的含义(第一个是单数,第二个是复数名称,如 househouses)。 我读到可以使用 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