web-dev-qa-db-fra.com

Comment dérouter des mots dans une liste de python?

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 ?

15
ChamingaD
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.

33
Gareth Latty

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 .

8
Thomas

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 ])
4
cha0site

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

3
Arash Hatami

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))
1
Thomas Decaux
from nltk.stem import PorterStemmer
ps = PorterStemmer()
list_stem = [ps.stem(Word) for Word in list]
1
Ghazal

Vous pouvez utiliser PorterStemmer ou LancasterStemmer pour l’essayer. 

0
9113303