J'ai une liste de python comme ci-dessous
documents = ["Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey"]
Maintenant, il faut que j'arrache (chaque mot) et que je reçoive une autre liste. Comment je fais ça ?
from stemming.porter2 import stem
documents = ["Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey"]
documents = [[stem(Word) for Word in sentence.split(" ")] for sentence in documents]
Ce que nous faisons ici utilise une liste comprehension pour parcourir chaque chaîne de la liste principale, en la scindant en une liste de mots. Ensuite, nous parcourons cette liste, en écrasant chaque mot au fur et à mesure, et en renvoyant la nouvelle liste de mots à tige.
S'il vous plaît noter que je n'ai pas essayé avec stemming installé - j'ai pris cela dans les commentaires, et ne l'ai jamais utilisé moi-même. C’est toutefois le concept de base pour scinder la liste en mots. Notez que cela produira une liste de listes de mots, en gardant la séparation originale.
Si vous ne voulez pas cette séparation, vous pouvez faire:
documents = [stem(Word) for sentence in documents for Word in sentence.split(" ")]
Au lieu de cela, ce qui vous laissera avec une liste continue.
Si vous souhaitez joindre les mots à la fin, vous pouvez faire:
documents = [" ".join(sentence) for sentence in documents]
ou le faire en une seule ligne:
documents = [" ".join([stem(Word) for Word in sentence.split(" ")]) for sentence in documents]
Où garder la structure de phrase, ou
documents = " ".join(documents)
Où l'ignorer.
Vous voudrez peut-être jeter un coup d'œil à la NLTK (Natural Language ToolKit). Il a un module nltk.stem qui contient différents types de stemmers.
Voir aussi cette question .
Bien. Donc, en utilisant le paquetage stemming , vous obtiendrez quelque chose comme ceci:
from stemming.porter2 import stem
from itertools import chain
def flatten(listOfLists):
"Flatten one level of nesting"
return list(chain.from_iterable(listOfLists))
def stemall(documents):
return flatten([ [ stem(Word) for Word in line.split(" ")] for line in documents ])
vous pouvez utiliser NLTK :
from nltk.stem import PorterStemmer
ps = PorterStemmer()
final = [[ps.stem(token) for token in sentence.split(" ")] for sentence in documents]
NLTK possède de nombreuses fonctionnalités pour les systèmes IR, vérifiez-le
Vous pouvez utiliser whoosh: ( http://whoosh.readthedocs.io/ )
from whoosh.analysis import CharsetFilter, StemmingAnalyzer
from whoosh import fields
from whoosh.support.charset import accent_map
my_analyzer = StemmingAnalyzer() | CharsetFilter(accent_map)
tokens = my_analyzer("hello you, comment ça va ?")
words = [token.text for token in tokens]
print(' '.join(words))
from nltk.stem import PorterStemmer
ps = PorterStemmer()
list_stem = [ps.stem(Word) for Word in list]
Vous pouvez utiliser PorterStemmer ou LancasterStemmer pour l’essayer.