LINUX.ORG.RU

Неправильно разделяет слова?

 ,


0

1

Пытаюсь подсчитать количество слов повторений в тексте выдается лабуда со словом «материале» хотя оно встречается лишь однажды вот исходный текст https://dropmefiles.com/n8Xok и обработанный https://dropmefiles.com/m3lYM и сам код:

#include <iostream>
#include <fstream>
#include <vector>
bool f(char c)
{
  if (c == ' ' || c == ',' || c == '.' || c == '?'
    || c == ':' || c == ';' || c == '<'
    || c == '>' || c == '!' || c == '-' || c=='\n' ||
    c == '1' || c == '2' || c == '3' || c == '4'
    || c == '5' || c == '6' || c == '7'
    || c == '8' || c == '9' || c == '0')
    return true;
  else
    return false;
}
int main()
{
  std::vector<std::pair<int, std::string>> v;
  std::pair<int, std::string> p;
  setlocale(LC_ALL, "en_US.UTF-8");
  char buff[255]; // буфер промежуточного хранения считываемого из файла текста
  std::ifstream fin("text.txt"); // (ВВЕЛИ НЕ КОРРЕКТНОЕ ИМЯ ФАЙЛА)
  std::ofstream fout("word.txt"); // создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt
  if (!fin.is_open()) // если файл не открыт
    std::cout << "Файл не может быть открыт!\n"; // сообщить об этом
  else
  {
    //fin >> buff; // считали первое слово из файла
    //std::cout << buff << std::endl; // напечатали это слово
    std::string str;
    while (fin.getline(buff, 255))
    {
      for (int i = 0; i < 255; i++)
      {
        
        if(f(buff[i]))
        {
          p.first = 0;
          p.second = str;
          std::cout << str << std::endl;
          fout <<str<<'\n'; // запись строки в файл
          v.push_back(p);
          str.clear();
        }
        else
          str += buff[i];
      }
    } // считали строку из файла
    fin.close(); // закрываем файл
    //std::cout << buff << std::endl; // напечатали эту строку
  }
  fout.close();
  return 0;
}

Ответ на: комментарий от bad_master

удоли, ты как примитивная нейросетка пишущая на винфак к каждому посту, задумайся об этом

Не угадал =) Я ваще первый раз в жизни написал: «на винфак». Повторюсь: «НА ВИНФАК!»

DELIRIUM ☆☆☆☆☆ ()

А зачем на C++? Это такая лаба или просто извращение? На Python-е это пишется в 10 минут... Хотя нет, вру, не в 10, а в 2.

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от Nervous
#! /usr/bin/env python3
# -*- coding: utf-8 -*-

unique_words = {}
with open('text.txt', 'r') as text_file:
    data = text_file.read()
    for word in data.split():
        if word in unique_words:
            unique_words[word] += 1
        else:
            unique_words[word] = 1
print(unique_words)

Зохвачено. Правда тут не повторения, а количество включений, как сделать так чтобы выводилось только количество включений ТС сам догадается. Только модуль re прикрепить для замены спецсимоволов вроде , и ? на пробелы, элементарно, конечно, но я не знаю как ему знаки учитывать надо в его задаче, как часть слова, убирать совсем или же отдельной единицей. А может вообще от белых списков плясать и считать словом только то, что из русских букв состоит и к маленькому регистру приводить. Ещё есть pymorphy2, если слова надо к начальной форме привести, например, для NLP задач.

На крестах алгоритм такой же, только надо подумать над тем, как split написать и что делать с регуляркой для чистки текста. Либо писать на C++ всё, либо тащить какую-то либу с поддержкой регулярок.

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 5)
Ответ на: комментарий от peregrine

зохвачено

freqs.clj

(ns freqs
  (:require [clojure.string :refer [split]]))

(defn -main [& args]
  (-> (slurp (first args))
      (split #"[\s\d<>,.:;?!-]+")
      frequencies
      println))

Запуск (в каталоге с исходником):

clojure -Sdeps '{:paths ["."]}' -m freqs text.txt
Nervous ★★★★★ ()
Последнее исправление: Nervous (всего исправлений: 2)

выдается лабуда

for (int i = 0; i < 255; i++)

Так обработка '\0' отсутствует. Он лезет дальше и обрабатывает мусор.

xaizek ★★★★★ ()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от xaizek

Это не все ошибки в его коде. Там в файле word.txt отнюдь не txt...

peregrine ★★★★★ ()
Ответ на: комментарий от deep-purple

мне с пыхом

У нас тут цивилизованный зохват, инклюзивность и дайверсити по полной программе.

Ждем саахрикту с паскалем.

Nervous ★★★★★ ()
Последнее исправление: Nervous (всего исправлений: 1)
Ограничение на отправку комментариев: только для зарегистрированных пользователей