Посчитайте, как часто слова из списка появляются в строке - PullRequest
0 голосов
/ 22 октября 2018

У меня есть предопределенный список слов;Например:

wordlist = [["one"],["two"],["three"]]

И у меня есть большой набор файлов .txt, также импортированных в python в виде списка, например:

corpus = ["my friend has one potato",
"i have two bananas and three apples",
"my dad has three apples"] 

Я хочу формулу, которая проходит через корпусстрока за строкой и сообщает мне количество слов из моего списка слов, которые содержатся в каждой строке;то есть, примерный вывод будет:

1
2
1

Мне не нужно разграничивать слова в списке слов.

Однако я хочу, чтобы это была формула, чтобы я мог легко ее применитьс другими списками слов или корпусами.

Я не нашел ответа ни на SO, ни где-либо еще.Я попробовал следующее:

wordcount_total=list()
for i in range(len(corpus)):
    row=corpus[i]
    wordcount_row=sum(1 for word in row.split() if word in wordlist)
    wordcount_total.append(wordcount_row)

Однако это дает мне:

0
0
0

Большое спасибо всем, кто хочет помочь!

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Проблема здесь:

sum(1 for word in row.split() if word in wordlist)

word - строка, но wordlist - список список строк .Эти два несопоставимы.

Вы можете использовать itertools.chain, чтобы сгладить ваш вложенный список.Вы также можете упростить свою логику, рассчитав длины пересечений set:

from itertools import chain

word_set = set(chain.from_iterable(wordlist))
res = [len(word_set & set(line.split())) for line in corpus]

[1, 2, 1]
0 голосов
/ 22 октября 2018

Рассмотрите также использование collections.Counter для этого.

counts = collections.Counter()
for line in corpus:
    for word in line.split():
        if word in wordlist:
            counts[word] += 1            

Если вы используете sklearn уже внутри и вокруг того, что вы делаете, другой вариант - использовать sklearn.CountVectorizer для этого, а затем просто зайдите после факта, чтобы взглянуть на словарь, чтобы увидеть счет:

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
vectorizer.fit(corpus)
vectorizer.vocabulary_

... где .vocabulary_ будет похожим на диктовку объектом, который имеет количество вword.

Этот последний метод будет хорошо масштабироваться и для других NLP-измов (например, удаление стоп-слов, взвешивание tf-idf).

0 голосов
/ 22 октября 2018

Создайте вспомогательную функцию следующим образом:

def find_num_occurences(word, string):
    return string.lower().split().count(word)

Затем используйте это для каждого слова в строке нужных вам слов:

for word in wordlist:
    word_count = 0
    for line in corpus:
        sum_in_line = find_num_occurences(word, line)
        word_count = word_count + sum_in_line
    print(word_count)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...